我正在将几百个存储过程从一个服务器迁移到另一个服务器,因此我想编写一个存储过程来在每个服务器上执行SP并比较输出的差异。
为了做到这一点,我通常会使用这种语法将结果输入表格:
select * into #tmp1 from OpenQuery(LocalServer,'exec usp_MyStoredProcedure')
select * into #tmp2 from OpenQuery(RemoteServer,'exec usp_MyStoredProcedure')
然后我会将它们联合起来并进行计数,以获得结果中有多少行不同:
select * into #tmp3
from ((select * from #tmp1) union (select * from #tmp2))
select count(*) from #tmp1
select count(*) from #tmp3
但是,在这种情况下,我的存储过程包含OpenQuery
,因此当我尝试将exec
放入OpenQuery
时,查询失败并显示错误:
The operation could not be performed because OLE DB provider "SQLNCLI"
for linked server "RemoteServer" was unable to begin a distributed transaction.
这有什么好的解决方法吗?或者,对于我能做些什么来使这个过程更快的事情,是否有人有任何聪明的想法?因为现在,我似乎必须在每台服务器上运行SP,将结果编写到tmp表中,然后进行比较。这似乎是一个糟糕的解决方案!
感谢您抽出宝贵时间阅读本文,并且非常感谢任何帮助!
答案 0 :(得分:0)
我认为您的方法可行 - 您只需启动MSDTC即可。如果禁用分布式事务处理协调器(DTS)服务或禁用网络DTC访问,则会发生此行为。默认情况下,Windows中禁用网络DTC访问。正确运行和配置后,OLE DB提供程序将能够启动分布式事务。
Check out this for instructions - 它适用于任何Windows Server 2003或2008。
答案 1 :(得分:0)