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:
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.columns C ON T.[object_id]=C.[object_id]
JOIN sys.schemas S ON T.[schema_id]=S.[schema_id]
WHERE C.name LIKE '%SOURCE%'
Wykonanie powyższego skryptu da następujący rezultat:
Nazwa tabeli | Nazwa kolumny |
---|---|
dbo.FindColumn1 | ID_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:
--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.columns C ON T.[object_id]=C.[object_id]
JOIN sys.schemas S ON 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 tabeli | Nazwa kolumny |
---|---|
dbo.FindColumn1 | ID_SOURCE |
dbo.FindColumn4 | Só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
Brak komentarzy - bądź pierwszy