Überprüfen Sie, ob Tabelle in SQL Server vorhanden ist
-
03-07-2019 - |
Frage
Ich würde dies gerne die ultimative Diskussion sein, wie Sie überprüfen, ob eine Tabelle in SQL Server 2000/2005 mit SQL-Anweisungen besteht.
Wenn Sie Google für die Antwort, man so viele verschiedene Antworten. Gibt es eine offizielle / vorwärts- und rückwärtskompatible Art und Weise tun?
Hier sind zwei Möglichkeiten, es zu tun. Welche unter dem beide ist der Standard / beste Weg, es zu tun?
Erste Möglichkeit:
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 bietet die einfache
SHOW TABLES LIKE '%tablename%';
Aussage. Ich suche nach etwas ähnlichem.
Lösung
Für Fragen wie diese ist es immer am besten, eine INFORMATION_SCHEMA
Ansicht zu verwenden. Diese Ansichten sind (meistens) Standard in vielen verschiedenen Datenbanken und selten ändern sich von Version zu Version.
Um zu überprüfen, ob eine Tabelle Verwendung vorhanden ist:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
Andere Tipps
Beachten Sie auch, dass, wenn Sie aus irgendeinem Grund für eine temporäre Tabelle überprüfen möchten, können Sie dies tun:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists
Wir verwenden immer die OBJECT_ID
Art für so lange ich mich erinnern
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
Bitte beachten Sie die folgenden Ansätze,
Ansatz 1: Verwendung INFORMATION_SCHEMA.TABLES ansehen
Wir können eine Abfrage wie unten schreiben zu überprüfen, ob eine Tabelle Kunden in der aktuellen Datenbank vorhanden ist.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
Ansatz 2: Verwendung von OBJECT_ID () Funktion
Wir können OBJECT_ID () Funktion wie unten verwenden, um zu überprüfen, ob eine Tabelle Kunden 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 sys.objects Catalog
Wir können die sys.objects Katalogansicht verwenden, um die Existenz der Tabelle zu überprüfen, wie unten dargestellt:
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 sys.tables Catalog
Wir können die sys.tables Katalogansicht verwenden, um die Existenz der Tabelle zu überprüfen, wie unten dargestellt:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Ansatz 5: Vermeiden Sie sys.sysobjects Systemtabelle Mit
Wir sollten vermeiden sys.sysobjects using System Tabelle direkt, direkten Zugang zu ihm in einigen zukünftigen Versionen des SQL Server veraltet. Gemäß Microsoft BOL Link, schlägt Microsoft direkt auf die Katalogansichten sys.objects / sys.tables statt sys.sysobjects Systemtabelle zu verwenden.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
bezeichnet von:
Nach einer Tabelle auf eine andere Datenbank: if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Ich wollte nur eine Situation erwähnen, wo es wahrscheinlich ein wenig leichter zu verwenden, um die OBJECT_ID
Methode wäre. Die INFORMATION_SCHEMA
Ansichten sind Objekte unter jeder Datenbank -
Die Informationsschemata Ansichten werden in einem speziellen Schema definiert benannt INFORMATION_SCHEMA. Dieses Schema ist in jeder Datenbank enthalten ist.
https://msdn.microsoft.com/en-us/library/ ms186778.aspx
Deshalb werden alle Tabellen, die Sie Zugriff mit
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 das widerspiegeln, was in [database]
ist. Wenn Sie, wenn Tabellen lesen wollte andere Datenbank vorhanden sein, ohne dynamisch die [database]
jedes Mal zu ändern, lassen OBJECT_ID
tun Sie dies aus der Box. 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 :
mit 2016 starten, vereinfachte Microsoft die Möglichkeit für nicht vorhandene Objekte zu überprüfen, vor dem Abwurf, durch den if exists
Hinzufügen von Keywords Aussagen drop
. Zum Beispiel:
drop table if exists mytablename
wird das gleiche wie OBJECT_ID
/ INFORMATION_SCHEMA
Wrapper tun, in 1 Zeile Code.
IF OBJECT_ID('mytablename') IS NOT NULL
, um das Informationsschema verwenden wird, um den SQL-Standard-Weg, es zu tun, so dass es von allen Datenbanken verwendet werden soll, die es unterstützen.
Wenn Sie auf verschiedene Datenbanken arbeiten:
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
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 in dem obigen Code, der Tabellenname ist Mapping_APCToFANavigator
.
Ich weiß, dass es eine alte Frage, aber ich habe diese Möglichkeit gefunden, wenn Sie planen oft zu nennen.
create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
Nur das Hinzufügen hier zum Nutzen der Entwickler und Kollegen DBAs
ein Skript, das @Tablename als Parameter
empfängt(die kann oder auch nicht das schema enthält) und gibt die Informationen weiter unten, wenn die schema.tabelle vorhanden ist:
the_name object_id the_schema the_table the_type
[Facts].[FactBackOrder] 758293761 Facts FactBackOrder Table
produzierte ich dieses Skript in anderen Skripten verwendet werden, jedes Mal, ich brauche zu testen, ob eine Tabelle oder Sicht vorhanden ist, und wenn es nicht, seine object_id bekommt für andere Zwecke verwendet werden.
Es wirft einen Fehler, wenn Sie entweder eine leere Zeichenfolge, falsche Schemanamen oder falsche Tabellennamen übergeben.
dies innerhalb einer Prozedur sein könnte und -1 zurück zum Beispiel.
Als Beispiel habe ich eine Tabelle „Facts.FactBackOrder“ in einem meiner Data Warehouse-Datenbanken genannt.
Dies ist, wie ich dieses Ziel 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,@Z-@I)
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 2000 Sie können versuchen:
IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
SELECT 1 AS 'res'
END
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PutSchemaHere'
AND
TABLE_NAME = 'PutTableNameHere'
)
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
Etwas wichtig für jemanden zu kennen, der ihre Lösung noch nicht gefunden hat: SQL Server! = MYSQL . Wenn Sie wollen, es zu tun mit MYSQL , es ist 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";
dieses Posting hier, weil es der Top-Hit bei Google ist.
select name from SysObjects where xType='U' and name like '%xxx%' order by name
- - create procedure 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 ;
- - wie man verwendet: überprüfen, ob Tabelle Migrationen existiert
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
Wenn jemand versucht, diese gleiche Sache in Linq zu tun, um zu SQL (oder besonders LINQPad) einschalten Option Systemtabellen und Ansichten enthalten und diesen Code tun:
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
gegeben, dass Sie ein Objekt mit dem Namen in einer Eigenschaft namens Artikeln haben, und das Schema in einer Eigenschaft namens Schema, in dem die Quelle Variablenname a
Wenn dies die ‚ultimative‘ Diskussion sein soll, dann sollte es, dass Larry Leonard zu beachten, Skript einen Remote-Server als auch abfragen, wenn die Server verbunden sind.
if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Ich habe einige Probleme hat entweder mit von INFORMATIONAL_SCHEME und OBJECT_ID auswählen. Ich weiß nicht, ob es ein Problem von ODBC-Treiber oder etwas ist .. Abfragen von SQL Management Studio, beide waren in Ordnung.
Hier ist die Lösung:
SELECT COUNT(*) FROM <yourTableNameHere>
Also, wenn die Abfrage fehlschlägt, gibt es wahrscheinlich keine solche Tabelle in der Datenbank (oder Sie haben keine Zugriffsrechte darauf haben).
Die Prüfung, indem der Wert (integer in meinem Fall) zurück von SQL-Executor erfolgt, die mit ODBC-Treiber befasst ..
if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
// myTable doesn't exist..
}
Führen Sie diese Abfrage 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';
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
Sehen Sie in einer Datenbank eine Tabelle t1 haben. Sie Skript auf andere Datenbank laufen wie - wenn t1 existieren dann nichts anderes tun t1 erstellen. Um dieses offene Visual Studio zu tun und wie folgt vor:
Rechtsklick auf t1, dann Script-Tabelle als, dann DROP und erstellen, um dann neue Abfrage-Editor
werden Sie Ihre gewünschte Abfrage finden. Aber bevor das Skript ausgeführt wird, vergessen Sie nicht die Drop-Anweisung in der Abfrage kommentieren, wie Sie nicht neue schaffen wollen, wenn man schon.
Danke