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
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?