sql >> Databasteknik >  >> RDS >> Sqlserver

6 sätt att kontrollera om en tabell finns i SQL Server (T-SQL-exempel)

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

  1. Konvertera 'tid' till 'datetimeoffset' i SQL Server (T-SQL-exempel)

  2. hur ändrar man stapelfärg i MPandroidCharts baserat på något individuellt värde lagrat i sqlite?

  3. MySQL IF() Funktion förklaras

  4. lagra arabiska i SQL-databas