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

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 实例不要将事务提升到链接服务器。请注意,这可能会产生其他后果,因此请谨慎使用。

【讨论】:

以上是关于将链接服务器存储过程中的数据插入表中的主要内容,如果未能解决你的问题,请参考以下文章

使用雪花中的存储过程将值插入表中

从表值参数将数据插入表中

将记录插入到具有180列的表中

使用存储过程将数据插入从其他表派生的表中

如何将存储过程的结果返回到用于插入记录的选择语句

在oracle存储过程中将数据插入到多个表中