将链接服务器存储过程中的数据插入表中

时间:2013-02-14 14:57:48

标签: sql sql-server-2008 stored-procedures linked-server

我们有一个SQL Server 2008“server1”的设置链接到另一个SQL服务器“server2”。 在“server2”上,有一个存储过程,我可以从“server1”查询得很好:

EXEC [server2].[xx].[dbo].[sp] param

但是,一旦我开始从链接服务器SP插入数据,我们就会遇到问题。 我们使用以下代码:

INSERT INTO server1.dbo.table (column1, column2, ...)
EXEC [server2].[xx].[dbo].[sp] param

当我们开始时,我们收到了“已知”错误,例如:

  

链接服务器“linkedserver”的OLE DB提供程序“SQLNCLI”返回消息“伙伴事务管理器已禁用其对远程/网络事务的支持。”。消息7391,级别16,状态2,行2无法执行操作,因为链接服务器“linkedserver”的OLE DB提供程序“SQLNCLI”无法启动分布式事务。

如类似问题所述: inserting to a local table from a linked stored procedure Inserting Results Of Stored Procedure From Linked Server

因此,我们在两台服务器上配置了MSDTC。现在查询运行20秒,然后中止并显示错误消息:

  

链接服务器“server2”的OLE DB提供程序“SQLNCLI10”返回消息“没有事务处于活动状态。”。   Msg 7391,Level 16,State 2,Line 14   无法执行该操作,因为链接服务器“server2”的OLE DB提供程序“SQLNCLI10”无法开始分布式事务。

与以前的错误相反,Windows事件日志中没有任何内容。

首先,由于INSERT进入本地表,我的查询被视为分布式事务吗?

其次,如果我尝试执行这样的分布式查询:

begin distributed tran
select * from [server2].master.sys.sysprocesses
commit tran

我在20秒后收到完全相同的错误消息。

我不知道如何从这里进一步调查。这可能是防火墙问题吗?

1 个答案:

答案 0 :(得分:0)

如果您不需要分发交易,上面@ rs链接的解决方案适合我。在这里重复解决方案:

EXECUTE sp_serveroption @server = '<remote_linked_server_name>', @optname = 'remote proc transaction promotion', @optvalue = 'false';

这告诉sql server实例不要将事务提升到链接服务器。请注意,这可能会产生其他后果,因此请慎重使用。