sql >> Database teknologi >  >> RDS >> Sqlserver

6 måder at kontrollere, om der findes en tabel i SQL Server (T-SQL-eksempler)

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

  1. Hvad er forskellen mellem BIT og TINYINT i MySQL?

  2. Sådan installeres og konfigureres phpMyAdmin på Debian 8

  3. I Oracle AS virker alias ikke

  4. SQL Server - Auto-inkrementering, der tillader UPDATE-sætninger