我有db A和db B.在存储过程开始时,我想备份从B.mytable
到B.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的“不存在”分支。
我做错了什么?
答案 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