sql >> Database >  >> RDS >> Sqlserver

6 manieren om te controleren of een tabel bestaat in SQL Server (T-SQL-voorbeelden)

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

  1. Hoe SQLite Upper() werkt

  2. Selecteer N-de rij uit een tabel in Oracle

  3. Gegevens visualiseren

  4. Groepeer DateTime in intervallen van 5,15,30 en 60 minuten