gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:21:59 25 4
gpt4 key购买 nike

需要有关以下问题的帮助:

情况 1:存储过程位于服务器 1 上 - 调用来自服务器 1

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

结果:执行成功

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

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

结果

Msg 7391, level 16, state 2, line 2
The operation could not be performed because OLEDB provider "SQLNCLI" for linkedserver "Server2_Database2" was unable to begin a distributed transaction.

案例3

但是当尝试单独执行存储过程[不插入临时表]时,如下所示

exec [database2_server2].[database1_server1].[dbo].[getcountrylist]

结果:即执行存储过程,没有任何错误并返回数据。

<小时/>

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

最佳答案

您(我相信)这里有两个选择:

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

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

    声明 @tempCountry 表(国家/地区名称 char(50))
    插入@tempCountry
    select * from openquery([database2_server2], '[database1_server1].[dbo].[getcountrylist]')
    从@tempCountry中选择*

  • 您可以将链接服务器的选项Enable Promotion Of Distributed Transaction设置为False,以防止本地事务促进分布式事务并因此使用MSDTC:

    EXEC master.dbo.sp_serveroption
    @server = N'database2_server2',
    @optname = N'远程proc事务提升',
    @optvalue = N'false'

    您的原始查询应该可以正常工作:

    声明 @tempCountry 表(国家/地区名称 char(50))
    插入@tempCountry
    exec [database2_server2].[database1_server1].[dbo].[getcountrylist]
    从@tempCountry中选择*

    Enable Promotion Of Distributed Transaction=False

  • 关于sql-server - 在链接服务器上执行 SP 并将其放入临时表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726567/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com