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
chcę dodać kolumnę, która będzie połączeniem dwóch innych istniejących już kolumn, jak powinien wyglądać scrypt?
Przydałyby się jeszcze 2 rzeczy do cz. 3 i byłoby superanckie.
1. Na starcie sortuje wg jakiejś kolumny i tam jest już strzałeczka. Widok takiej strzałeczki daje znać użytkownikowi, że taką tabele można sortować, a na razie pojawia się ona tylko po kliknięciu.
2. Uwzględnienie polskich znaków, bo np. przy sortowaniu Nazwisk i Imion jest to bardzo uciążliwe.
Ogólnie bardzo fajnie i prosto.
PS. Jest ten artykuł z jQuery już dostępny.
bardo ciekawe , można dzięki takim wpisom dostrzec wędkę..
Bardzo dziękuję za jasne tłumaczenie z dobrze dobranym przykładem!