将链接服务器存储过程中的数据插入表中
Posted
技术标签:
【中文标题】将链接服务器存储过程中的数据插入表中【英文标题】:Insert data from linked server stored procedure into table 【发布时间】:2013-02-14 14:57:48 【问题描述】:我们有一个连接到另一个 SQL 服务器“server2”的 SQL Server 2008“server1”的设置。 在“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”返回消息“没有事务处于活动状态。”。 消息 7391,第 16 级,状态 2,第 14 行 无法执行该操作,因为链接服务器“server2”的 OLE DB 提供程序“SQLNCLI10”无法开始分布式事务。
与之前的错误相反,Windows 事件日志中没有任何内容。
首先,由于 INSERT 到本地表,我的查询是否被视为分布式事务?
其次,如果我尝试执行这样的分布式查询:
begin distributed tran
select * from [server2].master.sys.sysprocesses
commit tran
我在 20 秒后收到完全相同的错误消息。
我不知道如何从这里进一步调查。会不会是防火墙问题?
【问题讨论】:
试试这个 - armaitus.wordpress.com/2011/09/30/… 【参考方案1】:如果您不需要分布式事务,上面@rs 链接中的解决方案对我有用。在这里重复解决方案:
EXECUTE sp_serveroption @server = '<remote_linked_server_name>', @optname = 'remote proc transaction promotion', @optvalue = 'false';
这告诉 sql server 实例不要将事务提升到链接服务器。请注意,这可能会产生其他后果,因此请谨慎使用。
【讨论】:
以上是关于将链接服务器存储过程中的数据插入表中的主要内容,如果未能解决你的问题,请参考以下文章