Oft stoßen wir auf ein Szenario, in dem wir Code basierend darauf ausführen müssen, ob eine Tabelle existiert oder nicht. Es gibt verschiedene Möglichkeiten, die Tabellenexistenz in SQL Server zu identifizieren, in diesem Artikel werden die verschiedenen Ansätze aufgeführt, die häufig verwendet werden, und ihre Vor- und Nachteile. Ich bevorzuge die Verwendung der Funktion OBJECT_ID (), da sie leicht zu merken ist. Lassen Sie mich wissen, welchen Ansatz Sie verwenden und warum.
Um diese verschiedenen Ansätze zu demonstrieren, erstellen wir eine Beispieldatenbank mit einer Tabelle mit dem folgenden Skript:
CREATE DATABASE SqlHintsDemoDBGOUSE SqlHintsDemoDBGOCREATE TABLE dbo.Customers (CustId INT, Name NVARCHAR(50))
Wie überprüfe ich, ob eine temporäre Tabelle in SQL Server vorhanden ist?
Ansatz 1: Verwenden von INFORMATION_SCHEMA.Tabellenansicht
Wir können eine Abfrage wie unten schreiben, um zu überprüfen, ob eine Customers-Tabelle in der aktuellen Datenbank vorhanden ist.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
ERGEBNIS:
Die obige Abfrage überprüft die Existenz der Customers-Tabelle in allen Schemas in der aktuellen Datenbank. Wenn Sie stattdessen die Existenz der Tabelle in einem bestimmten Schema und der angegebenen Datenbank überprüfen möchten, können Sie die obige Abfrage wie folgt schreiben:
IF EXISTS (SELECT * FROM SqlHintsDemoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
ERGEBNIS:
Vorteile dieses Ansatzes: INFORMATION_SCHEMA-Ansichten sind auf verschiedene RDBMS-Systeme portierbar, sodass für die Portierung auf verschiedene RDBMS keine Änderungen erforderlich sind.
So überprüfen Sie, ob eine gespeicherte Prozedur in SQL Server vorhanden ist
Ansatz 2: Verwenden der Funktion OBJECT_ID()
Wir können die Funktion OBJECT_ID() wie unten verwenden, um zu überprüfen, ob eine Kundentabelle in der aktuellen Datenbank vorhanden ist.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
ERGEBNIS:
Die Angabe des Datenbanknamens und des Schemanamens für den Tabellennamen ist optional. Die Angabe des Datenbanknamens und des Schemanamens bietet jedoch eine Option zum Überprüfen der Existenz der Tabelle in der angegebenen Datenbank und innerhalb eines angegebenen Schemas, anstatt die aktuelle Datenbank über alle Schemas hinweg einzuchecken. Die folgende Abfrage zeigt, dass wir, obwohl die aktuelle Datenbank eine MASTER-Datenbank ist, die Existenz der Customers-Tabelle im dbo-Schema in der SqlHintsDemoDB-Datenbank überprüfen können.
USE MASTERGOIF OBJECT_ID(N'SqlHintsDemoDB.dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
ERGEBNIS:
Vorteile: Leicht zu merken. Ein weiterer bemerkenswerter Punkt der Funktion OBJECT_ID() ist: Sie bietet eine Option zum Überprüfen der Existenz der temporären Tabelle, die im aktuellen Verbindungskontext erstellt wird. Bei allen anderen Ansätzen wird die Existenz der temporären Tabelle überprüft, die für den gesamten Verbindungskontext erstellt wurde, und nicht nur für den aktuellen Verbindungskontext. Die folgende Abfrage zeigt, wie die Existenz einer temporären Tabelle mit der Funktion OBJECT_ID() überprüft wird:
CREATE TABLE #TempTable(ID INT)GOIF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'ENDGO
ERGEBNIS:
So überprüfen Sie, ob eine Datenbank in SQL Server vorhanden ist
Ansatz 3: Verwenden von sys.Objekte Katalogansicht
Wir können die Sys verwenden.Objekte Katalogansicht, um die Existenz der Tabelle zu überprüfen, wie unten gezeigt:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')BEGIN PRINT 'Table Exists'END
ERGEBNIS
Überprüfen, ob ein Datensatz in einer Tabelle vorhanden ist
Ansatz 4: Verwenden von sys.Tabellen Katalogansicht
Wir können die Sys verwenden.Tabellen Katalogansicht, um die Existenz der Tabelle zu überprüfen, wie unten gezeigt:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')BEGIN PRINT 'Table Exists'END
ERGEBNIS
Sys.Tabellen Katalogansicht erbt die Zeilen aus dem Sys.Objektkatalogansicht, Sys.die Objektkatalogansicht wird als Basisansicht bezeichnet, wobei als sys.Tabellen wird als abgeleitete Ansicht bezeichnet. Sys.Tabellen geben die Zeilen nur für die Tabellenobjekte zurück, während Sys.Objektansicht Neben der Rückgabe der Zeilen für Tabellenobjekte werden Zeilen für Objekte wie gespeicherte Prozeduren, Ansichten usw. zurückgegeben.
Überprüfen, ob eine ANSICHT in SQL Server vorhanden ist
Ansatz 5: Vermeiden Sie die Verwendung von sys.sysobjects Systemtabelle
Wir sollten die Verwendung von sys vermeiden.sysobjects Systemtabelle direkt, der direkte Zugriff darauf wird in einigen zukünftigen Versionen des SQL Servers veraltet sein. Gemäß dem Microsoft BOL-Link schlägt Microsoft vor, die Katalogansichten sys zu verwenden.objekte/sys.tabellen statt sys.sysobjects Systemtabelle direkt.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')BEGIN PRINT 'Table Exists'END
ERGEBNIS:
:
Überprüfen, ob eine Datenbank vorhanden ist
Überprüfen, ob eine gespeicherte Prozedur in SQL Server vorhanden ist
Überprüfen, ob eine Ansicht vorhanden ist
Überprüfen, ob eine temporäre Tabelle vorhanden ist
Überprüfen, ob ein Datensatz in der Tabelle vorhanden ist