我正在尝试构建一个SSIS包,它动态地重建我数据库中所有表的索引。一般的想法是包将确保表没有被更新,然后执行删除旧索引的存储过程(如果存在),然后重新创建它。包装背后的逻辑似乎是合理的。我遇到的问题是当我执行包时,我一直收到错误:
无法找到对象...因为它不存在或您没有权限...
由于IF EXISTS
部分,现有索引应该无关紧要。
程序如下:
REFERENCE_NAME AS VARCHAR(50),
COLUMN_NAME AS VARCHAR(50),
INDEX_NAME AS VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'IF EXISTS (SELECT name FROM sysindexes WHERE name = '+CHAR(39)+@INDEX_NAME+CHAR(39)+') '+
'DROP INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+' '+
'CREATE INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+'('+@COLUMN_NAME+') ON [INDEX]'
EXEC sp_executesql @sql
END
GO
我能够通过SSMS执行该程序,没有错误,它构建了索引。当我在SSIS中执行包时,它会在执行存储过程的任务中出错。我确保SSIS将变量传递给执行SQL任务,并且我已经验证我有db_ddladmin权限。除此之外,我感到茫然,并且一直在墙上撞了一天半。
是否有我缺少的东西,我需要请求的一些权限,或者是否有一些解决问题的方法?
非常感谢任何信息。
答案 0 :(得分:0)
SSIS SQL Task似乎忽略了IF EXISTS
。为了解决我的问题,我将SQL任务从DROP - CREATE
更改为DISABLE - ENABLE
。