sql-server - 从 SSIS 运行时,存储过程返回架构版本更改错误,但直接运行时则不会

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

我有一个 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 语句,它将 View 中的数据合并到与 SP 位于同一服务器上的另一个数据库的表中。

该 View 引用链接服务器OtherServer。链接服务器上引用的数据库将被删除并每晚重新创建。

到目前为止,我已经尝试过以下方法:

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

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

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

4) 在 SSIS 中的相关步骤中将绕过准备设置为 true。

编辑:

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

最佳答案

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

1) 调用

DBCC FREEPROCCACHE

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

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

关于sql-server - 从 SSIS 运行时,存储过程返回架构版本更改错误,但直接运行时则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568083/

相关文章:

sql - 有条件的内部加入

在 Firebird 上只加入一次程序

sql-server - 在 SQL Server 中将 Bool 转换为 Bit

sql - 为什么关系在 SQL 实现中很重要?

tsql - 在 t-sql 中使用表名作为参数(例如来自@tblname)

sql-server - 将子查询的结果连接成单个值

t-sql - 将数据从临时表插入到多个相关表中?

sql-server - 使用 Visual Studio 数据库项目进行重要的增量更改部署

c# - 如何确定连接的数据库是否区分大小写

sql-server - SQL Server 中不等号 <> 和 != 之间有区别吗?