Dlaczego coś takiego nie działa?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Sprawdzam tylko, czy kolumna istnieje, jednak SQL Server narzeka, że Somecol
nie istnieje. Czy istnieje alternatywa dla tego w jednym stwierdzeniu?
sql-server
t-sql
Carson Reinke
źródło
źródło
CASE
instrukcję.INFORMATION_SCHEMA
może działać jako obejście.Odpowiedzi:
Poniższe zapytanie wykorzystuje ten sam pomysł, jak w tej niesamowitej odpowiedzi przez ypercube :
Działa to tak:
jeśli
dbo.Customers
zawiera kolumnę o nazwieSomeCol
, a następnieSomeCol
wSomeCol AS MyTest
rozwiąże jakdbo.Customers.SomeCol
;jeśli tabela nie ma takiej kolumny, odwołanie będzie nadal ważne, ponieważ teraz zostanie rozwiązane jako
dummy.SomeCol
:dummy
kolumny mogą być przywoływane w tym kontekście.W ten sposób możesz podać wiele „zapasowych” kolumn. Sztuczka polega na tym, aby nie używać aliasu tabeli dla takich kolumn (co w większości sytuacji jest nieprzyzwoite, ale w tym przypadku pominięcie aliasu tabeli pomaga rozwiązać problem).
Jeśli tabela jest używana w złączeniu, a druga tabela ma własną
SomeCol
, prawdopodobnie będziesz musiał użyć powyższej kwerendy jako tabeli pochodnej przed użyciem jej w złączeniu, aby utrzymać sztuczkę w działaniu, mniej więcej tak:źródło
Jednym ze sposobów jest sprawdzenie istnienia kolumn, a następnie zbudowanie dynamicznego SQL na podstawie tego, czy kolumna istnieje, czy nie.
Bez dynamicznego SQL SQL Server będzie próbował ocenić, czy kolumna istnieje, zanim jeszcze wykona statystykę, co spowoduje błąd.
Oznacza to jednak, że będziesz musiał napisać 2 zapytania i potencjalnie zmienić je w przyszłości. Ale nie sądzę, że naprawdę powinieneś kierować
SELECT
oświadczenia na kolumny, które mogą nie istnieć.źródło
Możesz skorzystać z niektórych plików XML, aby wyszukać kolumny, które mogą znajdować się w tabeli.
Zbuduj XML ze wszystkich kolumn w wierszu w krzyżowym zastosowaniu i wyodrębnij wartość, używając
values()
funkcji.W tym zapytaniu znany jest identyfikator, więc pobierz go bezpośrednio z tabeli. Col1 i Col2 mogą tam być lub nie, więc zdobądź je za pomocą XML.
SQL Fiddle
źródło
Moje podejście różni się tylko nieznacznie od innych. Wolę do tego użyć systemu i po prostu uzyskać liczbę, ponieważ możesz przypisać liczbę kolumn do zmiennej u góry zapytania, a następnie wybrać kontynuowanie lub nie na podstawie tego. Minusem tego jest… jeśli masz tę samą nazwę kolumny w wielu tabelach, nie masz pewności, że kolumna istnieje w tabeli, którą chcesz zapytać. Jednak technika ta działa również na poszczególnych stołach, ponieważ chcesz tylko policzyć.
„Problem” z pytaniem o to w szczególności - problem, którego doświadczasz. Ogólnie, jeśli wartość NULL powoduje problemy… znajdź inny sposób weryfikacji istnienia. Jest to jeden ze sposobów, aby to zrobić bez ryzyka zakłócenia działania serwera.
źródło
sysobjects
również w zapytaniu, aby sprawdzić, czy konkretna tabela ma taką kolumnę?SELECT 1 ...
też nie popełnia błędu.EXISTS (SELECT ...)
zwykle jest szybszy niż(SELECT COUNT(*) ...)
odwrotnie.Jeśli dobrze to zrozumiałem ...
Możesz użyć zapytania podobnego do poniższego i działać odpowiednio na podstawie liczby ... Jeśli liczba wynosi> 1, oznacza to, że masz kolumnę w tej tabeli, a liczba = 0, to nie masz tej kolumny w tym stół
WYBIERZ liczbę (*)
OD INFORMACJI_SCHEMA.KOLUMNÓW, GDZIE KOLUMNA_NAME W („Id”)
ORAZ TABELA_SCHEMA = „dbo” i TABLE_NAME = „Baza użytkowników”;
źródło