Den här artikeln erbjuder fem alternativ för att kontrollera om en tabell finns i SQL Server. De flesta alternativen innebär att man söker efter en systemvy, men ett av alternativen kör en systemlagrad procedur och ett annat involverar en funktion.
Jag inkluderar också några enkla IF
uttalanden som kan ändras för att passa dina omständigheter.
Alternativ 1 – vyn sys.tables
Det här alternativet frågar efter sys.tables
systemkatalogvy. Denna vy returnerar en rad för varje användartabell. Därför kan du fråga efter det med tabellnamnet du letar efter.
Exempel:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Du kan också lägga till schemanamnet till de saker du letar efter. Så här ändrar du den tidigare frågan så att den inkluderar schemanamnet:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Observera att sys.tables
view returnerar bara schema-ID så jag var tvungen att skicka det till SCHEMA_NAME()
funktion för att få sitt namn. Alternativt kunde jag ha använt schema-ID om jag hade vetat det.
Exempel:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Alternativ 2 – Sp_tables lagrade procedur
Nästa alternativ kör sp_tables
lagrad procedur.
Så här kan din kod vara kortfattad när du använder den här metoden:
sp_tables 'Artists'
Resultat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Den här lagrade proceduren returnerar dock vyer såväl som tabeller, så det är en bra idé att begränsa den till bara tabeller (såvida du inte också är intresserad av att få vyer returnerade). För att begränsa det till bara tabeller, använd @table_type = "'TABLE'"
.
Medan du håller på kan du även ange bordsägare och bordskvalificerare.
Exempel:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Resultat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Det är viktigt att notera att @table_type
parametern accepterar en kommaseparerad lista. Därför är det lite annorlunda än de andra parametrarna. @table_type
värdet måste omges av dubbla citattecken, och varje artikel omges av enkla citattecken. I mitt exempel finns det bara ett listobjekt, men det måste fortfarande omges av både dubbla och enkla citattecken.
Alternativ 3 – INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
systemvyn returnerar en rad för varje tabell eller vy i den aktuella databasen som den aktuella användaren har behörighet för. Det liknar sys.tables
, men det returnerar färre kolumner. Informationsschemavyerna som ingår i SQL Server överensstämmer med ISO-standarddefinitionen för INFORMATION_SCHEMA.
Här är ett exempel på hur du använder den för att kontrollera om en tabell finns i den aktuella databasen:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Resultat:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Här är den igen, men den här gången specificerar jag även schemat:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Resultat:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Alternativ 4 – OBJECT_ID()-funktionen
Du kan också använda en funktion som OBJECT_ID()
för att se om det returnerar ett icke-NULL-värde.
Exempel:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Resultat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
I det här fallet finns tabellen. Observera att jag använde U
för att ange objekttypen (användardefinierad tabell).
Du kan också ange ett tredelat namn för att inkludera databasen och schemat:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Resultat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Om tabellen inte finns får du NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
Se nedan för ett exempel på hur du använder detta i en IF
uttalande.
Alternativ 5 – vyn sys.objects
Som om inget av de tidigare exemplen kommer att göra jobbet, här är ännu ett sätt att kontrollera om en tabell finns.
Den här gången frågar jag sys.objects
systemkatalogvy. Den här vyn returnerar en rad för varje användardefinierat objekt med schemaomfattning i databasen. Det returnerar inte bara tabeller, det returnerar alla sorters objekt. Därför måste vi begränsa det till bara tabeller. I det här fallet är jag bara intresserad av användardefinierade tabeller, så jag kan använda type = 'U'
(U
är för "USER_TABLE"). Alternativt kan du använda TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Här är den igen, men anger schemat:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Alternativ 6 – vyn sys.sysobjects (UNDVIK)
Det här alternativet är bara listat så att jag kan rekommendera att inte använda det. sys.sysobjects
vyn ingår i SQL Server för bakåtkompatibilitet, och Microsoft rekommenderar att du undviker att använda den här vyn i framtida arbete.
Om du stöter på kod som använder den här vyn, överväg att ändra den för att använda sys.objects
eller någon annan systemvy eller lagrad procedur.
Hur som helst, så här kan det föregående exemplet se ut om du använder sys.sysobjects
istället för sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Resultat:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF-uttalande 1
Här är en enkel IF
uttalande som kontrollerar om tabellen finns och sedan skriver ut ett annat meddelande beroende på resultatet. Denna kod kan modifieras för att passa dina specifika behov.
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';
Resultat:
The table exists
Och så här ser det ut när tabellen inte finns:
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';
Resultat:
The table does not exist
IF-uttalande 2
Här är en annan IF
uttalande som kan modifieras för att passa dina specifika behov.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultat:
The table exists