为什么“如果不存在”在维护计划中不起作用?

时间:2019-04-18 05:32:10

标签: sql-server tsql ssms

我的维护计划包含以下T-SQL指令:

IF NOT EXISTS(
SELECT * 
FROM sys.indexes 
WHERE name='_Document415_Fld13294_Fld13301' AND object_id = OBJECT_ID('my_db.dbo._Document415')
) BEGIN 

create index [_Document415_Fld13294_Fld13301] on my_db.[dbo].[_Document415] ([_Fld13294RRef],[_Fld13301RRef])


END

但我收到此错误:

  

索引[_Document415_Fld13294_Fld13301]已存在

在维护计划中使用IF NOT EXISTS时似乎不起作用(因为在简单的查询中它就可以正常工作-没有错误)。

1 个答案:

答案 0 :(得分:1)

确切的批次应该到处出错。不要只考虑批次的一部分(例如,IF NOT EXISTS是孤立的。

为什么会出错?因为您看到的错误是编译错误。

为什么运行时检查不能保护您免受编译错误的影响?出于相同的原因,它在大多数语言 1 中都无效。编译是在执行之前进行的。

您需要防止内部语句被编译,直到运行时检查完成为止。将其移至EXEC sp_executesql中最容易做到:

IF NOT EXISTS(
SELECT * 
FROM sys.indexes 
WHERE name='_Document415_Fld13294_Fld13301' AND object_id = OBJECT_ID('my_db.dbo._Document415')
)
BEGIN 
    EXEC sp_executesql N'create index [_Document415_Fld13294_Fld13301] on my_db.[dbo].[_Document415] ([_Fld13294RRef],[_Fld13301RRef])'
END

1 假定该语言正在与编译器一起使用,并且在语句级别不会进行编译。