检查 SQL Server 中是否存在表

Check if table exists in SQL Server

提问人:Vincent 提问时间:10/4/2008 最后编辑:Bill Tür stands with UkraineVincent 更新时间:5/23/2023 访问量:1816334

问:

我希望这是关于如何使用 SQL 语句检查 SQL Server 2000/2005 中是否存在表的最终讨论。

这里有两种可能的方法。哪一个是标准/最好的方法?

第一种方式:

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;

第二种方式:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL提供了简单的

SHOW TABLES LIKE '%tablename%'; 

陈述。我正在寻找类似的东西。

sql-server t-sql sql-server-2005 sql-server-2000

评论


答:

16赞 Vinko Vrsalovic 10/4/2008 #1

使用信息架构是 SQL 标准方法,因此所有支持它的数据库都应该使用它。请参阅此答案中的方法 1。

评论

25赞 underscore_d 2/29/2016
这应该是一个评论。
5赞 rory.ap 3/8/2016
这个答案需要改进。
305赞 Bob King 10/4/2008 #2

从我记事起,我们就一直使用这种风格OBJECT_ID

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

评论

19赞 Joe Pineda 10/4/2008
我相信这会很快,尽管不是很便携。保证信息架构视图存在于支持该标准的任何 DBRMS 上。此外,普通OBJECT_ID并不能保证对象是表。
11赞 Apeiron 9/8/2011
谢谢乔,我想知道你为什么要使用 OBJECT_ID 而不是 INFORMATION_SCHEMA。TABLES 与 sys.tables。指出INFORMATION_SCHEMA是标准的一部分几乎可以回答这个问题。顺便说一句,这很有趣,我要问这个问题的一位数据库专家的姓氏和你一样,一定是数据库的好姓氏。
30赞 Allon Guralnek 10/5/2011
@JoePineda:然后你用例用来保证对象是一个表。OBJECT_ID('TableName', 'U')
1赞 defines 5/15/2012
那么,@AllonGuralnek,与其遵循简单便携的标准,不如添加一条额外的神秘信息?
31赞 Allon Guralnek 5/16/2012
@DustinFineout:这个问题被标记为 tsql,因此可移植性不太适用。总的来说,我遇到过真正可移植的代码库很少,如果简洁性受到重视,那么它肯定胜过一遍又一遍地从公认的答案中编写查询。此外,在阅读文档之前,一切都是神秘的,尤其是在 T-SQL(或任何其他变体)中。IF EXISTS
1611赞 akmad 10/4/2008 #3

对于这样的查询,最好始终使用视图。这些视图(大部分)是许多不同数据库中的标准视图,并且很少因版本而异。INFORMATION_SCHEMA

要检查表是否存在,请使用:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

评论

16赞 akmad 3/23/2010
鉴于不能保证单独的对象名称(即没有架构)是唯一的,因此没有 100% 的故障安全方法可以做到这一点。如果您使用的数据库在架构之间没有命名冲突,那么只需省略“TABLE_SCHEMA = 'TheSchema'”就可以了。
39赞 Pierre-Alain Vigeant 9/27/2010
若要检查临时表,我们必须查询 tempdb 数据库,并使用 LIKE 运算符作为表名SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
4赞 Rich Rousseau 9/4/2012
上面的 tempdb INFORMATION_SCHEMA查询将返回在任何连接上创建的临时表的行,而不仅仅是当前连接。这可能导致“if exists, then drop”语句失败。
5赞 Rich Rousseau 9/4/2012
下面使用 OBJECT_ID 函数的响应确实可以正确操作每个连接温度表 - stackoverflow.com/a/2155299/16147
5赞 Marc K 1/13/2014
@akmad SQL 查询编译器将在运行查询之前检查表,甚至在启动之前都会失败。
10赞 Even Mien 10/21/2009 #4

如果需要处理不同的数据库:

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

评论

3赞 quillbreaker 7/10/2013
是否确定?我的 2005 框中的信息架构仅返回当前目录。
347赞 James Bloomer 1/28/2010 #5

另请注意,如果出于任何原因需要检查临时表,可以这样做:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

评论

16赞 Rich Rousseau 9/4/2012
使用此方法似乎尊重临时表的每个连接性质。之前发布的INFORMATION_SCHEMA查询将返回行,而不考虑创建表的连接。
0赞 Artfaith 9/20/2022
已重新调谐:打开。ERROR 1305 (42000): FUNCTION table1.OBJECT_ID does not exist10.5.17-MariaDB-1:10.5.17+maria~ubu2004
7赞 dko 1/21/2011 #6

我知道这是一个老问题,但如果你打算经常打电话,我发现了这种可能性。

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

评论

10赞 Martin Smith 11/24/2011
-1.为此设置一个过程毫无意义,因为调用和使用返回值的代码与简单地执行选择一样多。应该使用数据类型而不是 .不应使用已弃用的视图,并且不考虑架构。sysnamevarchar(50)sysobjects
11赞 dilip kumar singh 4/7/2011 #7
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

在上面的代码中,表名是 .Mapping_APCToFANavigator

评论

2赞 marc_s 6/29/2011
如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ( ) 以很好地格式化和语法突出显示它!{ }
1赞 Olivier Jacot-Descombes 2/5/2014
请注意,在 SQL Server 的未来版本中,可能会停止对系统表的访问。请改用架构视图。
41赞 Larry Leonard 3/16/2012 #8

查找其他数据库上的表:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
-5赞 sumon 4/11/2013 #9

假设在一个数据库中,您有一个表 T1。你想在其他数据库上运行脚本,比如 - 如果 t1 存在,那么什么都不做,创建 t1。 为此,请打开 Visual Studio 并执行以下操作:

右键单击 t1,然后单击“将表脚本为”,然后单击 DROP 和“创建到”,然后单击“新建查询编辑器”

您将找到所需的查询。但在执行该脚本之前,不要忘记注释掉查询中的 drop 语句,因为如果已经有一个,则不想创建一个新语句。

谢谢

评论

0赞 Ivaylo Slavov 4/22/2015
在 SSMS 2012 中,它不再执行 if-exists 检查,如果它曾经这样做过(我不记得以前的版本是如何生成上述脚本的)。也许您误会了其他数据库工具编写表对象脚本的方式?
0赞 Seann Alexander 5/24/2018
SSMS 将执行 if-exists 检查(如果要求)。SQL Server 对象资源管理器>脚本>>工具>选项 “对象脚本选项”:“检查对象是否存在”= True
4赞 Moccassin 10/24/2013 #10
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
34赞 sansalk 11/22/2013 #11
IF OBJECT_ID('mytablename') IS NOT NULL 
0赞 Maslow 2/8/2014 #12

如果有人试图在 linq to sql(尤其是 linqpad)中执行相同的操作,请打开选项以包含系统表和视图,然后执行以下代码:

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

假设您有一个对象,其名称位于名为 item 的属性中,并且该架构位于名为 schema 的属性中,其中源变量名称为a

0赞 MarceloMadnezz 2/11/2014 #13
select name from SysObjects where xType='U' and name like '%xxx%' order by name
1赞 phil294 7/23/2014 #14

对于尚未找到解决方案的任何人来说,需要了解的重要信息是:SQL server != MYSQL。 如果你想用MYSQL来做,这很简单

    $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";

在这里发布这个,因为它是谷歌的热门。

评论

5赞 mordack550 7/23/2014
-1,因为 OP 恰好要求 SQL Server 解决方案来解决问题,而不是 MySQL 解决方案。他写了关于MySQL的文章,因为他知道DBMS的解决方案,并且他希望在SQL Server上获得相同的结果。此外,您的答案甚至不是MySQL查询,而是与MySQL一起使用的PHP代码。
4赞 Mark 8/2/2014
@mordack550,我同意布劳希恩的观点。他是对的。这是 Google 上用于查找 SQL 中是否存在表的热门内容。他的意图是好的,他的信息是有帮助的。+1
0赞 user3651072 8/19/2014 #15

如果这是“终极”讨论,那么应该注意的是,如果服务器是链接的,Larry Leonard 的脚本也可以查询远程服务器。

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

评论

0赞 EWit 8/19/2014
也许它更适合将其作为评论添加到伦纳德的答案中,或者作为编辑?
2赞 Biniam Eyakem 11/18/2014 #16

您可以使用以下命令:

     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
201赞 BrainCoder 12/22/2014 #17

请参阅以下方法,

方法 1:使用 INFORMATION_SCHEMA。TABLES 视图

我们可以编写如下查询来检查当前数据库中是否存在 Customers 表。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

方法 2:使用 OBJECT_ID() 函数

我们可以像下面这样使用 OBJECT_ID() 函数来检查当前数据库中是否存在 Customers 表。

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

方法 3:使用 sys。对象目录视图

我们可以使用 Sys.Objects 目录视图来检查表是否存在,如下所示:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

方法 4:使用 sys.表目录视图

我们可以使用 Sys.Tables 目录视图来检查表是否存在,如下所示:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

方法 5:避免使用 sys.sysobjects 系统表

我们应该避免直接使用 sys.sysobjects 系统表,在 Sql Server 的某些未来版本中将不推荐直接访问它。根据Microsoft BOL链接,Microsoft建议直接使用目录视图sys.objects/sys.tables而不是sys.sysobjects系统表。

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

来源:http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

评论

2赞 Andrew Jens 2/6/2021
如果需要考虑表架构(例如“dbo”或类似内容),请记住调整上述大部分内容。如果在不同的架构中创建相同的表名,这可能会避免以后出现问题。
5赞 Marcello Miorelli 1/24/2015 #18

只是在这里添加,以使开发人员和其他 DBA 受益

接收@Tablename作为参数的脚本

(可能包含也可能不包含 schemaname),如果 schema.table 存在,则返回以下信息:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

每次需要测试表或视图是否存在时,我都会生成此脚本,以便在其他脚本中使用,当确实存在时,将其object_id用于其他目的。

当您传递空字符串、错误的架构名称或错误的表名称时,它会引发错误。

例如,这可能位于过程内部并返回 -1。

例如,我的一个 Data Warehouse 数据库中有一个名为“Facts.FactBackOrder”的表。

我是这样实现的:

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 

评论

0赞 deroby 12/5/2016
脚本中有很多假设。例如,我可以很容易地删除一个名为的表,但由于多种原因,脚本找不到它。也就是说,不太可能有人想要创建这样的表,但仍然如此。无论如何,您的列被定义为 sysname 的列和一个点 (),所有这些都用方括号括起来......那个总有一天会失败的!dbo.[hello.world ]THE_NAMEsysname', yet you try to squeeze 2 .
0赞 Marcello Miorelli 12/5/2016
@deroby我同意 sysname 不是最好的数据类型,但该脚本已经运行了很长时间而没有任何错误,只有当我发现它不起作用的合理情况时,我才会花时间在它上面。更好的是,你把这段代码,改进它,把它作为答案发布在这里,我会测试它,如果它有效,我会给你的答案投赞成票。
5赞 dipi evil 4/16/2015 #19

SQL Server 2000 中,您可以尝试:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
36赞 John Smith 6/23/2016 #20

只是想提一种情况,使用该方法可能会更容易一些。视图是每个数据库下的对象 -OBJECT_IDINFORMATION_SCHEMA

信息架构视图在名为 INFORMATION_SCHEMA。此架构包含在每个数据库中。

https://msdn.microsoft.com/en-us/library/ms186778.aspx

因此,您使用

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;

只会反映 .如果要检查另一个数据库中的表是否存在,而不每次都动态更改,则可以开箱即用。前任-[database][database]OBJECT_ID

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

效果也一样好

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 编辑

从 2016 年开始,Microsoft 通过向语句添加关键字,简化了在删除之前检查不存在对象的功能。例如if existsdrop

drop table if exists mytablename

将在 1 行代码中执行与 / 包装器相同的操作。OBJECT_IDINFORMATION_SCHEMA

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

0赞 Mathieu Dierckx 9/6/2017 #21

-- --创建过程以检查表是否存在


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 ;

-- --使用方法:检查是否存在表迁移


 CALL checkIfTableExists('muDbName', 'migrations', @output);
1赞 Krishnaraj Barvathaya 6/19/2018 #22
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
2赞 Michael Quad 3/22/2019 #23

我在从 INFORMATIONAL_SCHEME 和 OBJECT_ID中进行选择时遇到了一些问题。我不知道是ODBC驱动程序的问题还是其他问题。来自 SQL Management Studio 的查询都没问题。

解决方案如下:

SELECT COUNT(*) FROM <yourTableNameHere>

因此,如果查询失败,则数据库中可能没有此类表(或者您没有访问它的权限)。

检查是通过比较处理ODBC驱动程序的SQL执行器返回的值(在我的情况下是整数)来完成的。

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

评论

0赞 wscourge 3/22/2019
失败的输出是什么?
0赞 Michael Quad 3/22/2019
@wscourge,SQL查询失败或类似情况。我只是检查执行器函数的返回值。
0赞 wscourge 3/22/2019
将其添加到您的答案中
0赞 Slashback 4/18/2021
使用 FireDac,如果表不存在,你会得到一个异常,既漂亮又简单。是的,我知道,不是 TSQL,欢迎来到现实世界。
-2赞 S Krishna 5/29/2019 #24

运行以下查询以检查数据库中是否存在该表:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';

评论

1赞 Joe S 9/29/2022
此查询可能会失败,因为未检查架构,这可能会导致返回多个结果。添加TABLE_SCHEMA条件将解决此问题。
2赞 Mohammad Reza Shahrestani 7/3/2019 #25
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
17赞 Reza Jenabi 9/15/2019 #26

您可以使用以下代码

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
0赞 Kelum Sampath Edirisinghe 1/6/2020 #27

我在这里以创建一个视图为例

因为 ALTER/CREATE 命令不能位于 BEGIN/END 块内。在执行创建之前,您需要测试是否存在并删除它

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

如果您担心权限丢失,也可以编写 GRANT 语句的脚本,并在最后重新运行这些语句。

您可以将创建/更改包装成一个字符串并执行 EXEC - 对于大型视图来说,这可能会变得丑陋

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
1赞 Jitan Gupta 2/27/2020 #28

还有一个选项可以检查表是否跨数据库存在

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
3赞 user19983897 10/3/2022 #29

我认为以下查询有效:

IF EXISTS (select * from sys.tables 
WHERE name='mytablename' )
BEGIN
     print 'table exists in the database'
END
0赞 Mohammadreza Askari 5/23/2023 #30

为什么大多数用户说“如果 *** 不是 null”?,尝试“如果 *** 为空”:)

IF OBJECT_ID(N'[dbo].[Error]', N'U') IS null
BEGIN
    CREATE TABLE [dbo].[Error](
        [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [Values] [nvarchar](MAX) NOT NULL,
        [Created] [datetimeoffset](0) NOT NULL,
        )
END