Sprawdź czy tabela istnieje w SQL Server
Chciałbym, aby była to ostateczna dyskusja na temat tego, jak sprawdzić, czy tabela istnieje w SQL Server 2000/2005 za pomocą instrukcji SQL.
Kiedy wyszukujesz odpowiedź w Google, dostajesz tyle różnych odpowiedzi. Czy istnieje oficjalny / wsteczny i wsteczny sposób na to?
Oto dwa możliwe sposoby, aby to zrobić. Który z nich jest standardowym / najlepszym sposobem na zrobienie tego?
Pierwsza droga:
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;
Druga droga:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL zapewnia simple
SHOW TABLES LIKE '%tablename%';
Oświadczenie. Szukam czegoś podobnego.
22 answers
Dla takich zapytań najlepiej jest użyć widoku INFORMATION_SCHEMA
. Widoki te są (głównie) standardowe w wielu różnych bazach danych i rzadko zmieniają się z wersji na wersję.
Aby sprawdzić, czy tabela istnieje użyj:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 10:26:39
Zauważ również, że jeśli z jakiegoś powodu musisz sprawdzić tymczasową tabelę, możesz to zrobić:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-28 14:50:03
Zawsze używamy stylu OBJECT_ID
od kiedy pamiętam
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:44:15
Zobacz poniższe podejścia,
Podejście 1: Korzystanie z INFORMATION_SCHEMA.Widok tabel
Możemy napisać zapytanie jak poniżej, aby sprawdzić, czy tabela klientów istnieje w bieżącej bazie danych.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
Podejście 2: Użycie funkcji OBJECT_ID ()
Możemy użyć funkcji OBJECT_ID (), jak poniżej, aby sprawdzić, czy tabela klientów istnieje w bieżącej bazie danych.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Podejście 3: Korzystanie z sys.Widok Katalogu Obiektów
Możemy użyć Sys.Widok katalogu obiektów w celu sprawdzenia istnienia tabeli, jak pokazano poniżej:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Podejście 4: Korzystanie z sys.Widok Katalogu Tabel
Możemy użyć Sys.Widok katalogu tabel w celu sprawdzenia istnienia tabeli, jak pokazano poniżej:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Podejście 5: Unikaj używania sys.sysobjects System table
Powinniśmy unikać używania sys.tablica systemowa sysobjects bezpośrednio, bezpośredni dostęp do niej będzie przestarzały w niektórych przyszłych wersjach Sql serwera. Jak na Microsoft BOL link, Microsoft sugeruje użycie widoku katalogu sys.obiekty / sys.tabele zamiast sys.tablica systemowa sysobjects bezpośrednio.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Od: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 12:01:58
Szukam tabeli w innej bazie danych:
if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-15 17:19:42
IF OBJECT_ID('mytablename') IS NOT NULL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:44:52
Chciałem tylko wspomnieć o jednej sytuacji, w której prawdopodobnie łatwiej byłoby użyć metody OBJECT_ID
. Widoki INFORMATION_SCHEMA
są obiektami pod każdą bazą danych -
Widoki schematów informacyjnych są zdefiniowane w specjalnym schemacie o nazwie INFORMATION_SCHEMA. Schemat ten jest zawarty w każdej bazie danych.
Https://msdn.microsoft.com/en-us/library/ms186778.aspx
Dlatego wszystkie tabele, do których uzyskujesz dostęp za pomocą
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;
Będzie odzwierciedlać tylko to, co jest w [database]
. Jeśli chcesz sprawdzić, czy tabele w innej bazie danych istnieją, bez dynamicznej zmiany [database]
za każdym razem, OBJECT_ID
pozwoli Ci to zrobić po wyjęciu z pudełka. Ex -
IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
Działa równie dobrze jak
IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
SQL SERVER 2016 Edit :
Od 2016 roku Microsoft uprościł możliwość sprawdzania nieistniejących obiektów przed upuszczeniem, dodając słowa kluczoweif exists
do instrukcji drop
. Na przykład,
drop table if exists mytablename
Zrobi to samo co OBJECT_ID
/ INFORMATION_SCHEMA
owijki, w 1 linijce kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 15:13:50
Użycie schematu informacyjnego jest standardowym sposobem SQL, więc powinien być używany przez wszystkie bazy danych, które go obsługują.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 16:03:54
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
Tutaj w powyższym kodzie nazwa tabeli to Mapping_APCToFANavigator
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 17:35:56
Jeśli potrzebujesz pracować na różnych bazach danych:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-21 14:58:15
Wiem, że to stare pytanie, ale znalazłem taką możliwość, jeśli planujesz często dzwonić.
create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 15:37:37
Dodaję tutaj, z korzyścią dla programistów i kolegów DBAs
Skrypt, który otrzymuje @Tablename jako parametr
(które mogą lub nie mogą zawierać nazwę schematu) i zwraca informacje poniżej, jeśli schemat.tabela istnieje:
the_name object_id the_schema the_table the_type
[Facts].[FactBackOrder] 758293761 Facts FactBackOrder Table
Stworzyłem ten skrypt do użycia wewnątrz innych skryptów za każdym razem, gdy muszę sprawdzić, czy istnieje tabela lub widok, a kiedy to nastąpi, uzyskam jego object_id, aby był używany do innych celów.
Rodzi błąd, gdy albo ty przekazywał pusty łańcuch, złą nazwę schematu lub złą nazwę tabeli.
Może to być wewnątrz procedury i zwracać -1 na przykład.
Jako przykład mam tabelę o nazwie " fakty.FactBackOrder " w jednej z moich baz danych hurtowni danych.
Tak to osiągnąłem:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 17:55:50
W SQL Server 2000 Możesz spróbować:
IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
SELECT 1 AS 'res'
END
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 13:42:06
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PutSchemaHere'
AND
TABLE_NAME = 'PutTableNameHere'
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 17:32:27
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-18 14:36:47
Coś ważnego dla każdego, kto jeszcze nie znalazł rozwiązania: SQL server != MYSQL . Jeśli chcesz to zrobić za pomocą MYSQL , jest to dość proste
$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";
Umieszczanie tego tutaj, ponieważ jest to top hit w Google.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 13:55:00
select name from SysObjects where xType='U' and name like '%xxx%' order by name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 18:54:51
Jeśli ktoś próbuje zrobić to samo w linq do sql (a szczególnie linqpad) włącz opcję dołączanie tabel systemowych i widoków i wykonaj ten kod:
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
Biorąc pod uwagę, że masz obiekt o nazwie w właściwości o nazwie item, a schemat we właściwości o nazwie schema, gdzie nazwa zmiennej źródłowej to a
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 18:48:06
Jeśli ma to być "ostateczna" dyskusja, to należy zauważyć, że skrypt Larry ' ego Leonarda może również odpytywać zdalny serwer, jeśli serwery są połączone.
if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 22:32:56
-- -- create procedure to checking if a table exists
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 ;
-- -- Jak używać: sprawdź, czy migracje tabel istnieją
CALL checkIfTableExists('muDbName', 'migrations', @output);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 09:39:37
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 08:54:28
Rozważ, że w jednej bazie danych masz tabelę t1. chcesz uruchomić skrypt na innej bazie np.-jeśli t1 istnieje to nie rób nic więcej Utwórz t1. Aby to zrobić, otwórz visual studio i wykonaj następujące czynności:
Kliknij prawym przyciskiem myszy na t1, następnie script table as, następnie upuść i utwórz do, a następnie nowy Edytor zapytań
Znajdziesz żądane zapytanie. Ale przed wykonaniem tego skryptu nie zapomnij skomentować instrukcji drop w zapytaniu, ponieważ nie chcesz tworzyć nowego, jeśli już istnieje.
Thanks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 18:32:06