Dit artikel biedt vijf opties om te controleren of een tabel bestaat in SQL Server. De meeste opties omvatten het opvragen van een systeemweergave, maar een van de opties voert een door het systeem opgeslagen procedure uit en een andere heeft betrekking op een functie.
Ik voeg ook enkele eenvoudige IF
toe verklaringen die kunnen worden aangepast aan uw omstandigheden.
Optie 1 – De sys.tables-weergave
Deze optie bevraagt de sys.tables
systeemcatalogus bekijken. Deze weergave retourneert een rij voor elke gebruikerstabel. Daarom kunt u het opvragen met behulp van de tabelnaam waarnaar u zoekt.
Voorbeeld:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Resultaat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
U kunt ook de schemanaam toevoegen aan de dingen waar u naar zoekt. U kunt als volgt de vorige query wijzigen om de schemanaam op te nemen:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultaat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Merk op dat de sys.tables
view retourneert alleen de schema-ID, dus ik moest die doorgeven aan de SCHEMA_NAME()
functie om zijn naam te krijgen. Als alternatief had ik de schema-ID kunnen gebruiken als ik dat had geweten.
Voorbeeld:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Resultaat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Optie 2 – De sp_tables opgeslagen procedure
De volgende optie voert de sp_tables
. uit opgeslagen procedure.
Hier ziet u hoe beknopt uw code kan zijn als u deze methode gebruikt:
sp_tables 'Artists'
Resultaat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Deze opgeslagen procedure retourneert echter zowel weergaven als tabellen, dus het is een goed idee om het te beperken tot alleen tabellen (tenzij u ook geïnteresseerd bent in het retourneren van weergaven). Om het te beperken tot alleen tabellen, gebruik @table_type = "'TABLE'"
.
Terwijl je toch bezig bent, kun je ook de tafeleigenaar en tafelkwalificatie specificeren.
Voorbeeld:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Resultaat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Het is belangrijk op te merken dat de @table_type
parameter accepteert een door komma's gescheiden lijst. Daarom is het een beetje anders dan de andere parameters. De @table_type
waarde moet tussen dubbele aanhalingstekens staan en elk item tussen enkele aanhalingstekens. In mijn voorbeeld is er maar één lijstitem, maar het moet nog steeds worden ingesloten tussen dubbele en enkele aanhalingstekens.
Optie 3 – INFORMATION_SCHEMA.TABLES
De INFORMATION_SCHEMA.TABLES
systeemweergave retourneert één rij voor elke tabel of weergave in de huidige database waarvoor de huidige gebruiker machtigingen heeft. Het lijkt op sys.tables
, maar het retourneert minder kolommen. De weergaven van het informatieschema in SQL Server voldoen aan de ISO-standaarddefinitie voor INFORMATION_SCHEMA.
Hier is een voorbeeld om het te gebruiken om te controleren of een tabel bestaat in de huidige database:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Resultaat:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Hier is het weer, maar deze keer specificeer ik ook het schema:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Resultaat:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Optie 4 – De OBJECT_ID() Functie
U kunt ook een functie gebruiken zoals OBJECT_ID()
om te zien of het een niet-NULL-waarde retourneert.
Voorbeeld:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Resultaat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
In dit geval bestaat de tabel. Merk op dat ik U
. heb gebruikt om het objecttype aan te geven (door de gebruiker gedefinieerde tabel).
U kunt ook een driedelige naam opgeven om de database en het schema op te nemen:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Resultaat:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Als de tabel niet bestaat, krijg je NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Resultaat:
+----------+ | Result | |----------| | NULL | +----------+
Zie hieronder voor een voorbeeld van het gebruik hiervan in een IF
verklaring.
Optie 5 – De sys.objects-weergave
Alsof geen van de voorgaande voorbeelden het werk zal doen, is hier nog een andere manier om te controleren of een tabel bestaat.
Deze keer vraag ik de sys.objects
systeemcatalogus bekijken. Deze weergave retourneert een rij voor elk door de gebruiker gedefinieerd object met schemabereik in de database. Het retourneert niet alleen tabellen, het retourneert allerlei soorten objecten. Daarom moeten we het beperken tot alleen tabellen. In dit geval ben ik alleen geïnteresseerd in door de gebruiker gedefinieerde tabellen, dus ik kan type = 'U'
gebruiken (U
is voor "USER_TABLE"). U kunt ook TYPE_DESC = 'USER_TABLE'
. gebruiken .
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Resultaat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Hier is het weer, maar met het schema:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultaat:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Optie 6 – De sys.sysobjects View (AVOID)
Deze optie wordt alleen vermeld zodat ik het gebruik ervan kan afraden. De sys.sysobjects
view is opgenomen in SQL Server voor achterwaartse compatibiliteit, en Microsoft raadt u aan deze view in toekomstig werk niet te gebruiken.
Als je code tegenkomt die deze weergave gebruikt, overweeg dan om deze aan te passen om sys.objects
te gebruiken of een andere systeemweergave of opgeslagen procedure.
In ieder geval, dit is hoe het vorige voorbeeld eruit zou kunnen zien als je sys.sysobjects
gebruikt in plaats van sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Resultaat:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF-verklaring 1
Hier is een eenvoudige IF
statement dat het bestaan van de tabel controleert en vervolgens een ander bericht afdrukt, afhankelijk van de uitkomst. Deze code kan worden aangepast aan uw specifieke behoeften.
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';
Resultaat:
The table exists
En zo ziet het eruit als de tabel niet bestaat:
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';
Resultaat:
The table does not exist
IF-verklaring 2
Hier is nog een IF
verklaring die kan worden aangepast aan uw specifieke behoeften.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultaat:
The table exists