Denne artikel tilbyder fem muligheder for at kontrollere, om der findes en tabel i SQL Server. De fleste muligheder involverer forespørgsler i en systemvisning, men en af indstillingerne udfører en systemlagret procedure, og en anden involverer en funktion.
Jeg inkluderer også nogle simple IF
udsagn, der kan ændres, så de passer til din situation.
Mulighed 1 – Sys.tables View
Denne mulighed forespørger sys.tables
systemkatalogvisning. Denne visning returnerer en række for hver brugertabel. Derfor kan du forespørge på det ved at bruge det tabelnavn, du søger efter.
Eksempel:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Du kan også tilføje skemanavnet til de ting, du søger efter. Sådan ændres den tidligere forespørgsel til at inkludere skemanavnet:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Bemærk, at sys.tables
view returnerer kun skema-id'et, så jeg var nødt til at videregive det til SCHEMA_NAME()
funktion for at få sit navn. Alternativt kunne jeg have brugt skema-id'et, hvis jeg havde vidst det.
Eksempel:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Mulighed 2 – Sp_tables Stored Procedure
Den næste mulighed udfører sp_tables
gemt procedure.
Her er, hvor kortfattet din kode kan være, når du bruger denne metode:
sp_tables 'Artists'
Resultat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Denne lagrede procedure returnerer dog visninger såvel som tabeller, så det er en god idé at indsnævre det til kun tabeller (medmindre du også er interesseret i at få visninger returneret). For at indsnævre det til kun tabeller, brug @table_type = "'TABLE'"
.
Mens du er i gang, kan du også angive bordejeren og bordkvalifikationen.
Eksempel:
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 er vigtigt at bemærke, at @table_type
parameter accepterer en kommasepareret liste. Derfor er det lidt anderledes end de andre parametre. @table_type
værdi skal være omgivet af dobbelte anførselstegn, og hver vare omgivet af enkelte anførselstegn. I mit eksempel er der kun ét listeelement, men det skal stadig være omgivet af både dobbelte og enkelte anførselstegn.
Mulighed 3 – INFORMATION_SCHEMA.TABLER
INFORMATION_SCHEMA.TABLES
systemvisning returnerer én række for hver tabel eller visning i den aktuelle database, som den aktuelle bruger har tilladelser til. Det ligner sys.tables
, men det returnerer færre kolonner. Informationsskemavisningerne inkluderet i SQL Server overholder ISO-standarddefinitionen for INFORMATION_SCHEMA.
Her er et eksempel på at bruge det til at kontrollere, om der findes en tabel i den aktuelle database:
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 | +-----------------+----------------+--------------+--------------+
Her er det igen, men denne gang angiver jeg også skemaet:
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 | +-----------------+----------------+--------------+--------------+
Mulighed 4 – OBJECT_ID()-funktionen
Du kan også bruge en funktion såsom OBJECT_ID()
for at se, om den returnerer en ikke-NULL-værdi.
Eksempel:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Resultat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
I dette tilfælde eksisterer tabellen. Bemærk, at jeg brugte U
for at angive objekttypen (brugerdefineret tabel).
Du kan også angive et tredelt navn for at inkludere databasen og skemaet:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Resultat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Hvis tabellen ikke eksisterer, får du NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
Se nedenfor for et eksempel på brug af dette i en IF
erklæring.
Mulighed 5 – Sys.objects View
Som om ingen af de foregående eksempler vil gøre jobbet, her er endnu en måde at kontrollere, om en tabel eksisterer på.
Denne gang forespørger jeg sys.objects
systemkatalogvisning. Denne visning returnerer en række for hvert brugerdefineret, skema-omfattet objekt i databasen. Det returnerer ikke bare tabeller, det returnerer alle mulige objekter. Derfor er vi nødt til at indsnævre det til kun tabeller. I dette tilfælde er jeg kun interesseret i brugerdefinerede tabeller, så jeg kan bruge type = 'U'
(U
er for "USER_TABLE"). Alternativt kan du bruge TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Her er det igen, men med angivelse af skemaet:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Mulighed 6 – Sys.sysobjects View (UNDGÅ)
Denne mulighed er kun angivet, så jeg kan fraråde at bruge den. sys.sysobjects
visning er inkluderet i SQL Server for bagudkompatibilitet, og Microsoft anbefaler, at du undgår at bruge denne visning i fremtidigt arbejde.
Hvis du støder på kode, der bruger denne visning, kan du overveje at ændre den til at bruge sys.objects
eller en anden systemvisning eller lagret procedure.
Under alle omstændigheder, her er, hvordan det forrige eksempel kunne se ud, hvis du bruger sys.sysobjects
i stedet for sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Resultat:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF-erklæring 1
Her er en simpel IF
erklæring, der kontrollerer, om tabellen findes, og derefter udskriver en anden besked afhængigt af resultatet. Denne kode kan ændres, så den passer til dine specifikke 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
Og sådan ser det ud, når bordet ikke eksisterer:
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-erklæring 2
Her er endnu en IF
erklæring, der kan ændres, så den passer til dine specifikke behov.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultat:
The table exists