Spis treści:

Kategoria:SQL Server


Wyszukiwanie tabeli zawierającej podaną kolumnę - SQL Server

Tym razem naszym zadaniem będzie odszukanie tabeli, w której występuje określona kolumna. Skrypt sprawdzi się wtedy, gdy znamy nazwę kolumny, a nie wiemy w której tabeli się ona znajduje.

Inny przypadek to wyszukanie wszystkich kolumn, które mają pewien ciąg znaków, na przykład %Kwota%. Zwykle kolumny nazywają się tak, aby opisywały dane w nich zawarte. To czyni skrypt jeszcze bardziej przydatnym.

Pobieranie listy tabel zawierających określoną kolumnę

Nazwa kolumny przekazywana będzie w postaci tekstowej, więc nic nie stoi na przeszkodzie, aby skorzystać z wszelkich dobrodziejstw SQL Server związanych ze znakami specjalnymi. Możemy wyszukiwać pełne nazwy (AAA), nazwy rozpoczynające się od podanej sekwencji (AAA%), nazwy zawierające podaną sekwencję (%AAA%).

Więcej na temat znaków specjalnych można znaleźć tutaj:

Przyjrzyjmy się przykładowi zaprezentowanemu poniżej:

--przykładowe tabele
CREATE TABLE dbo.FindColumn1(ID_SOURCE int)
CREATE TABLE dbo.FindColumn2(Kwota int)
CREATE TABLE dbo.FindColumn3(Kwas int)
CREATE TABLE dbo.FindColumn4(Sóurce int)

SELECT S.name+'.'+T.name [Nazwa tabeli], C.name [Nazwa kolumny]
FROM sys.tables T
JOIN sys.columnsON T.[object_id]=C.[object_id]
JOIN sys.schemasON T.[schema_id]=S.[schema_id]
WHERE C.name LIKE '%SOURCE%'

Wykonanie powyższego skryptu da następujący rezultat:

Nazwa tabeliNazwa kolumny
dbo.FindColumn1ID_SOURCE

Wynik nie jest zaskakujący. Trzeba jednak wiedzieć, że niektóre serwery działają w taki sposób, że na porównania wpływ ma wielkość liter (a może być równe A) i akcenty (a może być równe ą). Jest to tzw. COLLATION. W tego typu poszukiwaniach najczęściej nie zależy nam na precyzji porównań związanej z wielkością liter, a bardziej na znalezieniu kolumny spełniającej pewne kryteria. Zawsze istnieje możliwość jawnego podania sposobu porównywania dwóch wartości tekstowych. Pokazane jest to na poniższym listingu:

--Aby nie uwzględniać/uwzględniać wielkość liter
--oraz akcenty (aeąę) ustaw właściwe COLLATION
SELECT S.name+'.'+T.name [Nazwa tabeli], C.name [Nazwa kolumny]
FROM sys.tables T
JOIN sys.columnsON T.[object_id]=C.[object_id]
JOIN sys.schemasON T.[schema_id]=S.[schema_id]
WHERE C.name LIKE '%SóURĆę%' COLLATE Latin1_General_CI_AI
ORDER BY S.name,T.name  --Posortuj wyniki przestrzeń-tabela

Oprócz frazy COLLATION do zapytania dodałem sortowanie. Wynik tej instrukcji pokazany jest poniżej:

Nazwa tabeliNazwa kolumny
dbo.FindColumn1ID_SOURCE
dbo.FindColumn4Sóurce

Sposób porównania został ustawiony na Latin1_General_CI_AI. Jest to zwykłe porównanie alfabetu łacińskiego, w którym wielkość liter i akcent nie mają znaczenia. Jest to opcja, która będzie w tym kontekście chyba najczęściej wykorzystywana. Pokazane skrypty można oczywiście obudować w odpowiednie funkcje, ale to zadanie pozostawiam już czytelnikom.

Kategoria:SQL Server

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Kalkulator, jak kalkulator, na pewno nie uwzględnia wielu rzeczy. Dla przykładu, jedziemy po asfalcie, ja na rowerze trial (14 kg, opony 29x2,6) a obok mnie kolega na szosie. Robimy te same kilometry w tym samym czasie i niby tyle samo wysiłku włożyliśmy? Druga kwestia, idę na owym rowerze pojeździć po lesie, podjazd, zjazd, piasek etc. To nie to samo co jazda po ścieżce.
Całkiem niezły kalkulator, porównując rezultaty z suunto 9 baro wartości są niemal identyczne z tymże byłoby jeszcze lepiej gdyby dodać prędkość wiatru i przewyższenia. Zdecydowanie najlepszy kalkulator w necie.
Super wyjasnione, czytalo sie bardzo lekko. Dzieki i pozdrawiam
puściłem benta i leci klockiem w pomieszczeniu, w którym kodujemy