我的维护计划包含以下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
在维护计划中使用时不起作用(因为在简单查询中它工作得很好 - 没有错误)。
那个确切的批次应该到处都是错不要只考虑批次的一部分(例如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
1A假设语言与编译器一起使用,并且编译不会在语句级别发生。