Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

6 sposobów sprawdzenia, czy tabela istnieje w SQL Server (przykłady T-SQL)

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawiaj zbiorczo pola o stałej szerokości

  2. Instrukcja ALTER TABLE kolidowała z ograniczeniem FOREIGN KEY w SQL Server — SQL Sever / TSQL Tutorial, część 69

  3. Przenieś dane z jednej bazy danych do innej bazy danych

  4. Wstaw aktualizację wyzwalacza, jak określić, czy wstawiasz lub aktualizujesz

  5. Uruchamianie programu SQL Server 2014 na maszynie wirtualnej platformy Azure