Ten artykuł oferuje pięć opcji sprawdzania, czy tabela istnieje w SQL Server. Większość opcji wiąże się z zapytaniem o widok systemu, ale jedna z opcji wykonuje systemową procedurę składowaną, a inna obejmuje funkcję.
Dołączam również kilka prostych IF
oświadczenia, które można modyfikować w zależności od okoliczności.
Opcja 1 – Widok sys.tables
Ta opcja wysyła zapytanie do sys.tables
widok katalogu systemowego. Ten widok zwraca wiersz dla każdej tabeli użytkownika. Dlatego możesz wysłać zapytanie, używając nazwy tabeli, której szukasz.
Przykład:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Wynik:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Możesz także dodać nazwę schematu do rzeczy, które sprawdzasz. Oto jak zmodyfikować poprzednie zapytanie, aby zawierało nazwę schematu:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Wynik:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Zauważ, że sys.tables
view zwraca tylko identyfikator schematu, więc musiałem przekazać go do SCHEMA_NAME()
funkcji, aby uzyskać jej nazwę. Alternatywnie mógłbym użyć identyfikatora schematu, gdybym o tym wiedział.
Przykład:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Wynik:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opcja 2 – Procedura składowana sp_tables
Następna opcja wykonuje sp_tables
procedura składowana.
Oto, jak zwięzły może być Twój kod przy użyciu tej metody:
sp_tables 'Artists'
Wynik:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Jednak ta procedura składowana zwraca zarówno widoki, jak i tabele, więc dobrym pomysłem jest zawężenie jej do samych tabel (chyba że jesteś zainteresowany zwracaniem widoków). Aby zawęzić zakres do samych tabel, użyj @table_type = "'TABLE'"
.
W tym czasie możesz również określić właściciela stołu i kwalifikator stołu.
Przykład:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Wynik:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Należy pamiętać, że @table_type
parametr akceptuje listę oddzieloną przecinkami. Dlatego różni się nieco od pozostałych parametrów. @table_type
wartość musi być ujęta w podwójne cudzysłowy, a każdy element w pojedynczych cudzysłowach. W moim przykładzie jest tylko jeden element listy, jednak nadal musi być ujęty w cudzysłowy podwójne i pojedyncze.
Opcja 3 – INFORMACJE_SCHEMA.TABELI
INFORMATION_SCHEMA.TABLES
widok systemowy zwraca jeden wiersz dla każdej tabeli lub widoku w bieżącej bazie danych, do których bieżący użytkownik ma uprawnienia. Jest podobny do sys.tables
, ale zwraca mniej kolumn. Widoki schematów informacji zawarte w SQL Server są zgodne ze standardową definicją ISO dla INFORMATION_SCHEMA.
Oto przykład użycia go do sprawdzenia, czy tabela istnieje w bieżącej bazie danych:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Wynik:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Tutaj jest znowu, ale tym razem określam również schemat:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Wynik:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Opcja 4 – Funkcja OBJECT_ID()
Możesz także użyć funkcji takiej jak OBJECT_ID()
aby zobaczyć, czy zwraca wartość inną niż NULL.
Przykład:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Wynik:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
W takim przypadku tabela istnieje. Zauważ, że użyłem U
aby wskazać typ obiektu (tabela zdefiniowana przez użytkownika).
Możesz również podać trzyczęściową nazwę, aby uwzględnić bazę danych i schemat:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Wynik:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Jeśli tabela nie istnieje, otrzymasz NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Wynik:
+----------+ | Result | |----------| | NULL | +----------+
Zobacz poniżej przykład użycia tego w IF
oświadczenie.
Opcja 5 – Widok sys.objects
Jakby żaden z poprzednich przykładów nie wykonał zadania, oto kolejny sposób sprawdzenia, czy tabela istnieje.
Tym razem wysyłam zapytanie do sys.objects
widok katalogu systemowego. Ten widok zwraca wiersz dla każdego zdefiniowanego przez użytkownika obiektu o zakresie schematu w bazie danych. Zwraca nie tylko tabele, ale także wszelkiego rodzaju obiekty. Dlatego musimy zawęzić go do samych tabel. W tym przypadku interesują mnie tylko tabele zdefiniowane przez użytkownika, więc mogę użyć type = 'U'
(U
dotyczy „TABELA_UŻYTKOWNIKÓW”). Alternatywnie możesz użyć TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Wynik:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Oto znowu, ale z określeniem schematu:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Wynik:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opcja 6 – Widok sys.sysobjects (UNIKAJ)
Ta opcja jest wymieniona tylko po to, abym odradzał jej używanie. sys.sysobjects
widok jest zawarty w SQL Server w celu zapewnienia kompatybilności wstecznej, a Microsoft zaleca unikanie używania tego widoku w przyszłych pracach.
Jeśli napotkasz kod, który używa tego widoku, rozważ zmodyfikowanie go tak, aby używał sys.objects
lub inny widok systemowy lub procedura składowana.
W każdym razie, oto jak może wyglądać poprzedni przykład przy użyciu sys.sysobjects
zamiast sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Wynik:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF Oświadczenie 1
Oto prosty IF
instrukcja, która sprawdza istnienie tabeli, a następnie wyświetla inny komunikat w zależności od wyniku. Ten kod można zmodyfikować, aby odpowiadał Twoim konkretnym potrzebom.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Wynik:
The table exists
A oto jak to wygląda, gdy stół nie istnieje:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Wynik:
The table does not exist
IF Oświadczenie 2
Oto kolejny IF
oświadczenie, które można modyfikować w celu dostosowania do własnych potrzeb.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Wynik:
The table exists