Ich schreibe eine gespeicherte Prozedur in SQL Server 2008. Ich muss überprüfen, ob eine Tabelle in der Datenbank vorhanden ist. Wenn nicht, muss ich es erstellen.
Wie mache ich das?
Ich schreibe eine gespeicherte Prozedur in SQL Server 2008. Ich muss überprüfen, ob eine Tabelle in der Datenbank vorhanden ist. Wenn nicht, muss ich es erstellen.
Wie mache ich das?
CREATE TABLE IF NOT EXISTS ...
Antworten:
Etwas wie das
quelle
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
Nur zum Kontrast verwende ich gerne die Funktion object_id wie unten gezeigt. Es ist etwas einfacher zu lesen und Sie müssen sich keine Gedanken über sys.objects vs. sysobjects vs. sys.all_objects vs. sys.tables machen. Grundform:
Dies wird natürlich als " Vorhanden " angezeigt, wenn ein Objekt mit diesem Namen vorhanden ist. Wenn Sie nur Tabellen überprüfen möchten, benötigen Sie:
Es funktioniert auch für temporäre Tabellen:
quelle
Lassen Sie uns eine Beispieldatenbank mit einer Tabelle mit dem folgenden Skript erstellen:
Ansatz 1: Verwenden der Ansicht INFORMATION_SCHEMA.TABLES
Wir können eine Abfrage wie unten schreiben, um zu überprüfen, ob eine tblTest-Tabelle in der aktuellen Datenbank vorhanden ist.
Die obige Abfrage überprüft das Vorhandensein der Tabelle tblTest in allen Schemas in der aktuellen Datenbank. Wenn Sie stattdessen die Existenz der Tabelle in einem angegebenen Schema und der angegebenen Datenbank überprüfen möchten, können Sie die obige Abfrage wie folgt schreiben:
Vorteile dieses Ansatzes: INFORMATION_SCHEMA-Ansichten können auf verschiedene RDBMS-Systeme portiert werden, sodass für die Portierung auf verschiedene RDBMS keine Änderungen erforderlich sind.
Ansatz 2: Verwenden der Funktion OBJECT_ID ()
Wir können die folgende
OBJECT_ID()
Funktion verwenden, um zu überprüfen, ob eine tblTest-Tabelle in der aktuellen Datenbank vorhanden ist.Das Angeben der Teile Datenbankname und Schemaname für den Tabellennamen ist optional. Die Angabe des Datenbanknamens und des Schemanamens bietet jedoch die Möglichkeit, das Vorhandensein der Tabelle in der angegebenen Datenbank und in einem angegebenen Schema zu überprüfen, anstatt die aktuelle Datenbank in allen Schemas einzuchecken. Die folgende Abfrage zeigt, dass wir, obwohl die aktuelle Datenbank eine MASTER-Datenbank ist, die Existenz der
tblTest
Tabelle imdbo
Schema in derTest
Datenbank überprüfen können .Vorteile: Leicht zu merken. Ein weiterer bemerkenswerter Punkt, der über die
OBJECT_ID()
Funktion erwähnt werden muss, ist: Sie bietet eine Option zum Überprüfen der Existenz der temporären Tabelle, die im aktuellen Verbindungskontext erstellt wird. Alle anderen Ansätze überprüfen das Vorhandensein der temporären Tabelle, die im gesamten Verbindungskontext und nicht nur im aktuellen Verbindungskontext erstellt wurde. Die folgende Abfrage zeigt, wie Sie das Vorhandensein einer temporären Tabelle mithilfe derOBJECT_ID()
Funktion überprüfen können:Ansatz 3: Verwenden der Katalogansicht von sys.Objects
Wir können die
Sys.Objects
Katalogansicht verwenden, um das Vorhandensein der Tabelle wie folgt zu überprüfen:Ansatz 4: Verwenden der Katalogansicht von sys.Tables
Wir können die
Sys.Tables
Katalogansicht verwenden, um das Vorhandensein der Tabelle wie folgt zu überprüfen:Sys.Tables
Die Katalogansicht erbt die Zeilen von derSys.Objects
Katalogansicht. DieSys.objects
Katalogansicht wird als Basisansichtsys.Tables
bezeichnet, während sie als abgeleitete Ansicht bezeichnet wird.Sys.Tables
Gibt die Zeilen nur für die Tabellenobjekte zurück, währendSys.Object
view neben der Rückgabe der Zeilen für Tabellenobjekte auch Zeilen für die Objekte zurückgibt, z. B.: gespeicherte Prozedur, Ansichten usw.Ansatz 5: Vermeiden Sie die Verwendung der Systemtabelle sys.sysobjects
Wir sollten vermeiden,
sys.sysobjects
die Systemtabelle direkt zu verwenden. In einigen zukünftigen Versionen des SQL Servers wird der direkte Zugriff darauf veraltet sein. Gemäß dem Link [Microsoft BOL] [1] schlägt Microsoft vor, die Katalogansichtensys.objects/sys.tables
anstelle dersys.sysobjects
Systemtabelle direkt zu verwenden.Referenz: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
quelle
BEARBEITET
Sie können in sys.tables nachsehen, ob die gewünschte Tabelle vorhanden ist:
quelle
quelle
quelle
Versuchen Sie die folgende Anweisung, um das Vorhandensein einer Tabelle in der Datenbank zu überprüfen:
Sie können die Tabelle im if-Block erstellen.
quelle
sysobjects
gibt es eine Kompatibilitätsansicht, die nur existiert, um zu vermeiden, dass älterer Code beschädigt wird. Mein Vorschlag zur Verwendung Systemkatalogsichten (zB würdesys.objects
,sys.tables
) für Code, der nur SQL Server 2008 Instanzen Ziel, und Informationsschema Ansichten (zBinformation_schema.tables
) für Code , dass Bedürfnisse tragbar sein. Weitere Informationen zu den verschiedenen Ansichten finden Sie hier: Abfragen des SQL Server-SystemkatalogsWenn ich mich nicht irre, sollte dies funktionieren:
quelle