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
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).
Super robota, korzystając z innych internetowych kalkulatorow po prostu wątpiłem w ich prawdomówność, w końcu trafiłem tutaj i wynik w końcu jest wiarygodny. 40 km w 2 h 810 kcal, ciekawostka: na fitatu wyliczyło mi 5700 kcal 😊 najlepiej będzie chyba jak kupię zegarek sportowy.
Wielkie dzieki za solidne wyjasnienia tematu.