【问题标题】:Stored Procedure gives Cannot find object... error in SSIS, but works fine in SSMS存储过程在 SSIS 中给出找不到对象...错误,但在 SSMS 中工作正常
【发布时间】:2015-01-30 23:49:04
【问题描述】:

我正在尝试构建一个 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 权限。除此之外,我很茫然,为此我已经把头撞在墙上一天半了。

是否有我遗漏的东西、我需要请求的一些权限或解决此问题的一些方法?

任何信息将不胜感激。


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

【问题讨论】:

  • 您能否确定这实际上是过程中的错误还是表明它没有看到 proc(可能是错误的数据库)的 SSIS 错误?你是如何执行包的?手动通过数据工具?
  • 您是否尝试过在 @sql 语句中添加 BEGIN/END 的完整性检查? 'BEGIN DROP INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+' END '+...
  • 当你运行 SSIS 包时,你确定它在和 ssms 相同的权限下运行
  • Bartover,它绝对没有看错数据库。我已经检查并仔细检查了 proc 是否确实存在,并且我在 SSIS 包上的唯一连接是到该特定数据库。是的,我正在使用 Visual Studios 2010 Shell Data Tools 手动执行 SSIS 包。

标签: sql sql-server stored-procedures ssis


【解决方案1】:

看起来IF EXISTS 正在被 SSIS SQL 任务忽略。为了解决我的问题,我将 SQL 任务从 DROP - CREATE 更改为 DISABLE - ENABLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多