Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

6 Möglichkeiten, um zu überprüfen, ob eine Tabelle in SQL Server existiert (T-SQL-Beispiele)

Dieser Artikel bietet fünf Optionen zum Überprüfen, ob eine Tabelle in SQL Server vorhanden ist. Die meisten Optionen beinhalten das Abfragen einer Systemansicht, aber eine der Optionen führt eine gespeicherte Systemprozedur aus und eine andere beinhaltet eine Funktion.

Ich füge auch einige einfache IF ein Aussagen, die an Ihre Umstände angepasst werden können.

Option 1 – Die sys.tables-Ansicht

Diese Option fragt die sys.tables ab Systemkatalogansicht. Diese Ansicht gibt eine Zeile für jede Benutzertabelle zurück. Daher können Sie es mit dem Tabellennamen abfragen, nach dem Sie suchen.

Beispiel:

SELECT 
  object_id 
FROM sys.tables
WHERE name = 'Artists';

Ergebnis:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Sie können auch den Schemanamen zu den Dingen hinzufügen, nach denen Sie suchen. So ändern Sie die vorherige Abfrage, um den Schemanamen einzuschließen:

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Ergebnis:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Beachten Sie, dass die sys.tables view gibt nur die Schema-ID zurück, also musste ich diese an SCHEMA_NAME() übergeben Funktion, um seinen Namen zu erhalten. Alternativ hätte ich die Schema-ID verwenden können, wenn ich das gewusst hätte.

Beispiel:

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND schema_id = 1;

Ergebnis:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Option 2 – Die gespeicherte Prozedur sp_tables

Die nächste Option führt die sp_tables aus gespeicherte Prozedur.

So prägnant kann Ihr Code sein, wenn Sie diese Methode verwenden:

sp_tables 'Artists'

Ergebnis:

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Diese gespeicherte Prozedur gibt jedoch sowohl Ansichten als auch Tabellen zurück, daher ist es eine gute Idee, sie auf nur Tabellen einzugrenzen (es sei denn, Sie möchten auch Ansichten zurückgeben). Um es auf Tabellen einzugrenzen, verwenden Sie @table_type = "'TABLE'" .

Wenn Sie schon dabei sind, können Sie auch den Tabelleneigentümer und den Tabellenqualifizierer angeben.

Beispiel:

EXEC sp_tables 
  @table_name = 'Artists',  
  @table_owner = 'dbo',
  @table_qualifier = 'Music',
  @table_type = "'TABLE'",
  @fUsePattern = 1;

Ergebnis:

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Es ist wichtig zu beachten, dass der @table_type Der Parameter akzeptiert eine durch Kommas getrennte Liste. Daher unterscheidet es sich ein wenig von den anderen Parametern. Der @table_type Der Wert muss in doppelte Anführungszeichen und jedes Element in einfache Anführungszeichen gesetzt werden. In meinem Beispiel gibt es nur ein Listenelement, es muss jedoch sowohl in doppelte als auch in einfache Anführungszeichen gesetzt werden.

Option 3 – INFORMATION_SCHEMA.TABLES

Die INFORMATION_SCHEMA.TABLES Systemansicht gibt eine Zeile für jede Tabelle oder Ansicht in der aktuellen Datenbank zurück, für die der aktuelle Benutzer Berechtigungen hat. Es ähnelt sys.tables , gibt aber weniger Spalten zurück. Die in SQL Server enthaltenen Informationsschemaansichten entsprechen der ISO-Standarddefinition für das INFORMATION_SCHEMA.

Hier ist ein Beispiel für die Verwendung, um zu prüfen, ob eine Tabelle in der aktuellen Datenbank vorhanden ist:

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists';

Ergebnis:

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Hier ist es wieder, aber dieses Mal gebe ich auch das Schema an:

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists'
AND TABLE_SCHEMA = 'dbo';

Ergebnis:

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Option 4 – Die OBJECT_ID()-Funktion

Sie können auch eine Funktion wie OBJECT_ID() verwenden um zu sehen, ob es einen Nicht-NULL-Wert zurückgibt.

Beispiel:

SELECT OBJECT_ID('Artists', 'U') AS Result;

Ergebnis:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

In diesem Fall existiert die Tabelle. Beachten Sie, dass ich U verwendet habe zur Angabe des Objekttyps (benutzerdefinierte Tabelle).

Sie können auch einen dreiteiligen Namen angeben, um die Datenbank und das Schema einzuschließen:

SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;

Ergebnis:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Wenn die Tabelle nicht existiert, erhalten Sie NULL :

SELECT OBJECT_ID('Oops!', 'U') AS Result;

Ergebnis:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Unten finden Sie ein Beispiel für die Verwendung in einem IF Aussage.

Option 5 – Die sys.objects-Ansicht

Als ob keines der vorherigen Beispiele die Aufgabe erfüllen würde, ist hier noch eine weitere Möglichkeit, um zu überprüfen, ob eine Tabelle existiert.

Dieses Mal frage ich die sys.objects ab Systemkatalogansicht. Diese Ansicht gibt eine Zeile für jedes benutzerdefinierte Objekt im Schemabereich in der Datenbank zurück. Es gibt nicht nur Tabellen zurück, es gibt alle Arten von Objekten zurück. Daher müssen wir es auf Tabellen beschränken. In diesem Fall interessieren mich nur benutzerdefinierte Tabellen, daher kann ich type = 'U' verwenden (U steht für „USER_TABLE“). Alternativ können Sie TYPE_DESC = 'USER_TABLE' verwenden .

SELECT 
  object_id 
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists';

Ergebnis:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Hier ist es noch einmal, aber mit Angabe des Schemas:

SELECT 
  object_id  
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Ergebnis:

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Option 6 – Die sys.sysobjects-Ansicht (VERMEIDEN)

Diese Option ist nur aufgeführt, damit ich davon abraten kann. Die sys.sysobjects Die Ansicht ist aus Gründen der Abwärtskompatibilität in SQL Server enthalten, und Microsoft empfiehlt, diese Ansicht bei zukünftigen Arbeiten nicht mehr zu verwenden.

Wenn Sie auf Code stoßen, der diese Ansicht verwendet, sollten Sie erwägen, ihn so zu ändern, dass er sys.objects verwendet oder eine andere Systemansicht oder gespeicherte Prozedur.

Auf jeden Fall könnte das vorherige Beispiel so aussehen, wenn sys.sysobjects verwendet wird anstelle von sys.objects .

SELECT
  id  
FROM sys.sysobjects 
WHERE xtype = 'U' 
AND name = 'Artists';

Ergebnis:

+-----------+
| id        |
|-----------|
| 885578193 |
+-----------+

IF-Anweisung 1

Hier ist ein einfaches IF -Anweisung, die das Vorhandensein der Tabelle überprüft und dann je nach Ergebnis eine andere Meldung ausgibt. Dieser Code kann an Ihre speziellen Anforderungen angepasst werden.

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';

Ergebnis:

The table exists

Und so sieht es aus, wenn die Tabelle nicht existiert:

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';

Ergebnis:

The table does not exist

IF-Anweisung 2

Hier ist ein weiteres IF Erklärung, die an Ihre spezifischen Bedürfnisse angepasst werden kann.

IF OBJECT_ID('Artists', 'U') IS NOT NULL  
  PRINT 'The table exists'
ELSE 
  PRINT 'The table does not exist';

Ergebnis:

The table exists