【问题标题】:Stored Procedure returns schema version change error when run from SSIS, but not when run directly从 SSIS 运行时,存储过程返回架构版本更改错误,但直接运行时不返回
【发布时间】:2013-05-10 04:53:51
【问题描述】:

我有一个 SQL Server 存储过程,每次使用 EXEC 手动运行时都能正确执行,但是当它作为 SSIS 包的一部分运行时,它会失败并出现如下错误:

Executing the query "EXECUTE (ProcName)   " failed with the following error: 
"The OLE DB provider "SQLNCLI10" for linked server "(OtherServer)" reported a 
change in schema version between compile time ("177833127975044") and 
run time ("177841717910098") for table (Server.Database.Schema.Table)".

该过程是一个MERGE 语句,它将视图中的数据合并到与 SP 位于同一服务器上的另一个数据库中的表中。

视图引用链接服务器OtherServer。链接服务器上引用的数据库每晚都会被删除并重新创建。

到目前为止,我已经尝试过这些事情:

1) 在运行 MERGE 之前删除并重新创建视图。

2) 定义包含 MERGE WITH RECOMPILE 的 SP。

3) 将 MERGE 语句包装在 EXEC() 中,这样就不会提前编译。

4) 在 SSIS 的相关步骤中将 Bypass Prepare 设置为 true。

编辑

带有存储过程的服务器正在运行 SQL Server 2008。链接服务器是 2008 R2。

【问题讨论】:

  • 有点笨拙,但是你能不能每次重新创建时将数据(不使用SSIS)从重新创建的数据库传输到静态数据库,并在视图中引用静态数据库.我不确定有什么方法可以让 SSIS 与一个被删除并重新创建的数据库配合得很好。除非你每次都重新创建你的 SSIS 包。
  • 您使用的是什么版本的 SSIS?
  • 有一些相关的讨论here

标签: sql-server tsql stored-procedures ssis sql-merge


【解决方案1】:

所以问题是您使用的是链接服务器对象的同义词,它不能很好地与 OLEDB 的元数据目录配合使用(这就是生成您在错误消息中看到的那些数字的原因。)对此有两种解决方案:

1) 调用

DBCC FREEPROCCACHE

在链接服务器上。由于无论如何每天都会删除数据库,因此清除缓存可能不会对数据库的其他用户造成如此大的负担。

2) 在存储过程中使用完整的四部分表示法 (ServerName.DatabaseName.SchemaName.ObjectName)。

【讨论】:

  • 我已经在做#2了。当我清理错误以在此处发布时,我过度简化了它。立即尝试#1。
  • 看起来#1 完成了这项工作。我必须在托管 SP 的服务器上运行它,但之后它运行成功。不过,有没有办法将范围限制为一个数据库?我真的不想每次运行时都刷新所有数据库的过程缓存。
  • DBCC FLUSHPROCINDB(db_id(@DatabseName));
  • 谢谢。这完美地完成了这项工作。
  • 曾经只做 #2 对我有用,在另一个例子中它没有,所以 #1 为我解决了这个问题
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多