存储过程给出了在SSIS中找不到对象...错误,但在SSMS中工作正常

时间:2015-01-30 23:49:05

标签: sql sql-server stored-procedures ssis

我正在尝试构建一个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权限。除此之外,我感到茫然,并且一直在墙上撞了一天半。

是否有我缺少的东西,我需要请求的一些权限,或者是否有一些解决问题的方法?

非常感谢任何信息。


巴顿,它绝对不会看错了数据库。我已经检查过proc是否存在,并且包上唯一的连接是该特定数据库。是的,我正在使用Visual Studios 2010 Shell Data Tools手动执行包。 Sorrel,我尝试了对drop上的@sql语句进行健全性检查的想法,在drop和create以及整个@sql语句上,没有任何乐趣。 Gnackenson,我有同样的想法,但连接身份验证方法设置为Windows身份验证,与ssms相同。您对可能使用不同权限的原因有任何想法吗?

1 个答案:

答案 0 :(得分:0)

SSIS SQL Task似乎忽略了IF EXISTS。为了解决我的问题,我将SQL任务从DROP - CREATE更改为DISABLE - ENABLE