Ich möchte, dass dies die ultimative Diskussion darüber ist, wie mithilfe von SQL-Anweisungen überprüft werden kann, ob eine Tabelle in SQL Server 2000/2005 vorhanden ist.
Wenn Sie nach der Antwort googeln, erhalten Sie so viele verschiedene Antworten. Gibt es eine offizielle/vorwärts- und rückwärtskompatible Möglichkeit, dies zu tun?
Hier sind zwei Möglichkeiten, dies zu tun. Welcher von beiden ist der Standard/beste Weg, dies zu tun?
Erster Weg:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Zweiter Weg:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL liefert das Einfache
SHOW TABLES LIKE '%tablename%';
aussage. Ich suche etwas ähnliches.
Für Abfragen wie diese ist es immer am besten, eine INFORMATION_SCHEMA
-Ansicht zu verwenden. Diese Ansichten sind (meistens) Standard in vielen verschiedenen Datenbanken und ändern sich selten von Version zu Version.
Um zu überprüfen, ob eine Tabelle existiert, verwenden Sie:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
Beachten Sie auch, dass Sie Folgendes tun können, wenn Sie aus irgendeinem Grund nach einer temporären Tabelle suchen müssen:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists
Wir verwenden immer den OBJECT_ID
-Stil, solange ich mich erinnere
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
Bitte beachten Sie die folgenden Ansätze,
Ansatz 1: Verwenden der Ansicht INFORMATION_SCHEMA.TABLES
Wir können eine Abfrage wie unten schreiben, um zu überprüfen, ob in der aktuellen Datenbank eine Kundentabelle vorhanden ist.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
Ansatz 2: Verwendung der OBJECT_ID () - Funktion
Wir können die OBJECT_ID () -Funktion wie folgt verwenden, um zu überprüfen, ob eine Customers-Tabelle in der aktuellen Datenbank vorhanden ist.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Ansatz 3: Verwenden der sys.Objects-Katalogansicht
Wir können die Sys.Objects-Katalogansicht verwenden, um die Existenz der Tabelle wie folgt zu überprüfen:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Ansatz 4: Verwenden der sys.Tables-Katalogansicht
Wir können die Sys.Tables-Katalogansicht verwenden, um die Existenz der Tabelle wie folgt zu überprüfen:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Ansatz 5: Vermeiden Sie die Verwendung der sys.sysobjects-Systemtabelle
Wir sollten es vermeiden, die sys.sysobjects-Systemtabelle direkt zu verwenden. In einigen zukünftigen Versionen von SQL Server wird der direkte Zugriff darauf veraltet sein. Gemäß Microsoft BOL-Link schlägt Microsoft vor, die Katalogsichten sys.objects/sys.tables anstelle der Systemtabelle sys.sysobjects direkt zu verwenden.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
verwiesen von: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
Suchen nach einer Tabelle in einer anderen Datenbank:
if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Ich wollte nur eine Situation erwähnen, in der es wahrscheinlich etwas einfacher wäre, die OBJECT_ID
-Methode zu verwenden. Die INFORMATION_SCHEMA
-Ansichten sind Objekte unter jeder Datenbank.
Die Informationsschemasichten sind in einem speziellen Schema mit dem Namen INFORMATION_SCHEMA definiert. Dieses Schema ist in jeder Datenbank enthalten.
https://msdn.Microsoft.com/en-us/library/ms186778.aspx
Daher alle Tabellen, auf die Sie mit zugreifen
IF EXISTS (SELECT 1
FROM [database].INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
wird nur widerspiegeln, was in [database]
ist. Wenn Sie überprüfen möchten, ob Tabellen in einer anderen Datenbank vorhanden sind, ohne den [database]
jedes Mal dynamisch zu ändern, können Sie dies mit OBJECT_ID
sofort tun . Ex-
IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
funktioniert genauso gut wie
IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
SQL SERVER 2016 Bearbeiten :
Ab 2016 hat Microsoft die Möglichkeit vereinfacht, vor dem Löschen nach nicht vorhandenen Objekten zu suchen, indem if exists
Schlüsselwörter zu drop
Anweisungen hinzugefügt wurden. Zum Beispiel,
drop table if exists mytablename
wird das Gleiche tun wie die Wrapper OBJECT_ID
/INFORMATION_SCHEMA
in einer Codezeile.
IF OBJECT_ID('mytablename') IS NOT NULL
Die Verwendung des Informationsschemas ist die SQL-Standardmethode, daher sollte es von allen Datenbanken verwendet werden, die es unterstützen.
IF EXISTS
(
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]')
AND
type in (N'U')
)
BEGIN
-- Do whatever you need to here.
END
Hier im obigen Code lautet der Tabellenname Mapping_APCToFANavigator
.
Wenn Sie an verschiedenen Datenbanken arbeiten müssen:
DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'
DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'
DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @Catalog
AND TABLE_SCHEMA = @Schema
AND TABLE_NAME = @Table))
BEGIN
--do stuff
END
Ich weiß, es ist eine alte Frage, aber ich habe diese Möglichkeit gefunden, wenn Sie es oft anrufen möchten.
create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
Fügen Sie hier nur zum Nutzen der Entwickler und anderen Datenbankadministratoren hinzu
ein Skript, das @Tabellenname als Parameter empfängt
(der den Schemanamen enthalten kann oder nicht) und gibt die folgenden Informationen zurück, wenn die schema.table vorhanden ist:
the_name object_id the_schema the_table the_type
[Facts].[FactBackOrder] 758293761 Facts FactBackOrder Table
Ich habe dieses Skript erstellt, um es in anderen Skripten zu verwenden, wenn ich testen muss, ob eine Tabelle oder Sicht vorhanden ist, und wenn dies der Fall ist, muss die object_id für andere Zwecke verwendet werden.
Es wird ein Fehler ausgelöst, wenn Sie entweder eine leere Zeichenfolge, einen falschen Schemanamen oder einen falschen Tabellennamen übergeben haben.
dies könnte sich in einer Prozedur befinden und beispielsweise -1 zurückgeben.
Als Beispiel habe ich eine Tabelle mit dem Namen "Facts.FactBackOrder" in einer meiner Data Warehouse-Datenbanken.
So habe ich das erreicht:
PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME()
PRINT ''
GO
SET NOCOUNT ON
GO
--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================
DECLARE @TableName SYSNAME
SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT
SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)
IF (@Z = 0) BEGIN
RAISERROR('Invalid @Tablename passed.',16,1)
END
SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I
IF @I > 0 BEGIN
--===================================================================================
-- a schema and table name have been passed
-- example Facts.FactBackOrder
-- @Schema = Fact
-- @TableName = FactBackOrder
--===================================================================================
SELECT @Schema = SUBSTRING(@TABLENAME,1,@I-1)
SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@[email protected])
END
ELSE BEGIN
--===================================================================================
-- just a table name have been passed
-- so the schema will be dbo
-- example Orders
-- @Schema = dbo
-- @TableName = Orders
--===================================================================================
SELECT @Schema = 'DBO'
END
--===================================================================================
-- Check whether the @SchemaName is valid in the current database
--===================================================================================
IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN
RAISERROR('Invalid Schema Name.',16,1)
END
--SELECT @Schema as [@Schema]
-- ,@TableName as [@TableName]
DECLARE @R1 TABLE (
THE_NAME SYSNAME
,THE_SCHEMA SYSNAME
,THE_TABLE SYSNAME
,OBJECT_ID INT
,THE_TYPE SYSNAME
,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)
)
;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
,the_schema=SCHEMA_NAME(O.schema_id)
,the_table=O.NAME
,object_id =o.object_id
,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
THE_NAME
,THE_SCHEMA
,THE_TABLE
,OBJECT_ID
,THE_TYPE
)
SELECT the_name
,the_schema
,the_table
,object_id
,the_type
FROM RADHE_01
WHERE the_schema = @Schema
AND the_table = @TableName
IF (@@ROWCOUNT = 0) BEGIN
RAISERROR('Invalid Table Name.',16,1)
END
ELSE BEGIN
SELECT THE_NAME
,THE_SCHEMA
,THE_TABLE
,OBJECT_ID
,THE_TYPE
FROM @R1
END
In SQL Server 20 können Sie versuchen:
IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
SELECT 1 AS 'res'
END
Sie können dies verwenden:
IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL
BEGIN
print 'deleted table';
drop table t
END
else
begin
print 'table not found'
end
Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
insert into t( name, lastname) values('john','doe');
insert into t( name, lastname) values('rose',NULL);
Select * from t
1 john doe
2 rose NULL
-- clean
drop table t
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PutSchemaHere'
AND
TABLE_NAME = 'PutTableNameHere'
)
Wichtig für alle, die noch keine Lösung gefunden haben: SQL Server! = MYSQL. Wenn Sie es mit MYSQL machen wollen, ist es ganz einfach
$sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
$result = mysql_query($sql);
if( $result == false )
echo "table DOES NOT EXIST";
else
echo "table exists";
Posten Sie dies hier, weil es der Top-Hit bei Google ist.
Erstellen Sie eine Prozedur, um zu überprüfen, ob eine Tabelle vorhanden ist
DELIMITER $$
DROP PROCEDURE IF EXISTS `checkIfTableExists`;
CREATE PROCEDURE checkIfTableExists(
IN databaseName CHAR(255),
IN tableName CHAR(255),
OUT boolExistsOrNot CHAR(40)
)
BEGIN
SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = databaseName)
AND (TABLE_NAME = tableName);
END $$
DELIMITER ;
Verwendung: Überprüfen Sie, ob Tabellenmigrationen vorhanden sind
CALL checkIfTableExists('muDbName', 'migrations', @output);
IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
SELECT * FROM dbo.TableName;
END
GO
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted
BEGIN
--TABLE EXISTS
END
ELSE BEGIN
--TABLE DOES NOT EXISTS
END
select name from SysObjects where xType='U' and name like '%xxx%' order by name
Wenn dies die "ultimative" Diskussion sein soll, sollte beachtet werden, dass das Skript von Larry Leonard auch einen Remote-Server abfragen kann, wenn die Server miteinander verbunden sind.
if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Wenn jemand versucht, dasselbe in linq to sql (oder insbesondere in linqpad) zu tun, aktivieren Sie die Option, um Systemtabellen und -ansichten einzuschließen, und führen Sie den folgenden Code aus:
let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null
vorausgesetzt, Sie haben ein Objekt mit dem Namen in einer Eigenschaft namens item und das Schema in einer Eigenschaft namens schema, wobei der Name der Quellvariablen a
lautet.
Ich hatte einige Probleme mit der Auswahl von INFORMATIONAL_SCHEME und OBJECT_ID. Ich weiß nicht, ob es sich um ein Problem mit dem ODBC -Treiber oder etwas anderem handelt. Abfragen von SQL Management Studio waren beide in Ordnung.
Hier ist die Lösung:
SELECT COUNT(*) FROM <yourTableNameHere>
Wenn die Abfrage fehlschlägt, ist wahrscheinlich keine solche Tabelle in der Datenbank vorhanden (oder Sie haben keine Zugriffsberechtigungen dafür).
Die Prüfung erfolgt durch Vergleichen des vom SQL-Executor zurückgegebenen Werts (in meinem Fall Integer), der sich mit dem ODBC -Treiber befasst.
if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
// myTable doesn't exist..
}
Führen Sie diese Abfrage aus, um zu überprüfen, ob die Tabelle in der Datenbank vorhanden ist:
IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';