在链接服务器上执行SP并将其放在临时表中

use*_*921 7 sql-server stored-procedures linked-server

需要一些关于以下问题的帮助:

案例1:存储过程在服务器1上 - 来自server1的调用

declare @tempCountry table (countryname char(50))
insert into @tempCountry
    exec [database1_server1].[dbo].[getcountrylist]
Select * from @tempCountry
Run Code Online (Sandbox Code Playgroud)

结果:成功执行

案例2:如果使用链接服务器从不同的服务器调用相同的存储过程,如下所示:

declare @tempCountry table (countryname char(50))
insert into @tempCountry
    exec [database2_server2].[database1_server1].[dbo].[getcountrylist]
Select * from @tempCountry
Run Code Online (Sandbox Code Playgroud)

结果

消息7391,级别16,状态2,行2
无法执行操作,因为linkedserver"Server2_Database2"的OLEDB提供程序"SQLNCLI"无法启动分布式事务.

案例3

但是当试图单独执行存储过程[没有临时表插入]如下所示

exec [database2_server2].[database1_server1].[dbo].[getcountrylist]
Run Code Online (Sandbox Code Playgroud)

结果:正在执行存储过程而没有任何错误并返回数据.


我忘了提到我正在使用SQL Server 2005.根据服务器管理员的说法,我建议使用的功能在2005年不可用.

And*_*zov 12

你有(我相信)两种选择:

  1. 尝试通过使用OPENQUERY行集函数来避免使用MSDTC(以及与分布式事务相关的所有这些不愉快的事情)

    / 假设(此处和下面)[database2_server2]是链接服务器的名称 /

    declare @tempCountry table (countryname char(50)) insert into @tempCountry select * from openquery([database2_server2], '[database1_server1].[dbo].[getcountrylist]') select * from @tempCountry

要么

  1. 您可以设置链接服务器的选项Enable Promotion Of Distributed Transaction,False以防止本地事务提升分布式事务,从而使用MSDTC:

    EXEC master.dbo.sp_serveroption @server = N'database2_server2', @optname = N'remote proc transaction promotion', @optvalue = N'false'

    并且您的原始查询应该正常工作:

    declare @tempCountry table (countryname char(50)) insert into @tempCountry exec [database2_server2].[database1_server1].[dbo].[getcountrylist] select * from @tempCountry

    启用分布式事务的促销= False