如何从不同的sql db检查表的存在?

时间:2013-10-02 14:35:14

标签: sql-server tsql sql-server-2008-r2 exists

我有db A和db B.在存储过程开始时,我想备份从B.mytableB.mytablebackup的所有行。存储过程的其余部分针对db A上的表运行(它收集数据并将其写入B.mytable)。

所以我检查B.mytablebackup是否存在

IF EXISTS(SELECT 1 FROM B.dbo.mytablebackup)

如果是,则存储过程执行

INSERT INTO B..mytablebackup SELECT * FROM B..mytable

如果它不存在则执行

SELECT * INTO B..mytablebackup from B..mytable

但是当我执行存储过程时,我收到错误

  

数据库中已有一个名为'mytablebackup'的对象

我添加了一个Print语句,并执行了IF的“不存在”分支。

我做错了什么?

3 个答案:

答案 0 :(得分:12)

对于SQL Server,您应该使用系统视图sys.tables来检查表是否存在。

IF EXISTS(SELECT 1 FROM B.sys.tables WHERE name = 'mytablebackup')

答案 1 :(得分:0)

OBJECT_ID也可以使用:

IF OBJECT_ID('B.dbo.mytablebackup') IS NOT NULL

答案 2 :(得分:0)

您可以直接从给定的DB,SCHEMA和TABLE参数中进行检查(用于动态数据库,模式和表)

DECLARE @targetdatabase  NVARCHAR(MAX),
        @SchemaName      NVARCHAR(MAX),
        @TableName       NVARCHAR(MAX)

DECLARE @TempTableName NVARCHAR(MAX) = QUOTENAME(@targetdatabase) + '.' + 
QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName)

IF OBJECT_ID(@TempTableName) IS NULL
BEGIN
    PRINT @TempTableName
END