链接服务器失败时存储过程被卡住

问题描述 投票:0回答:1

我在SQL Server 2016上有一个Linked Server(到Oracle Server)。然后我创建一个Stored Procedure来选择链接服务器,就像这样。

CREATE PROCEDURE dbo.TestSelectData
AS
SELECT *
FROM LinkedServer..TestUser.TestTable

在正常连接上,它成功运行。并且Stored Procedure返回预期的结果。但是当与链接服务器的连接中断(密码错误,IP错误等)时,Stored Procedure没有引发错误并且永远运行。

我试图将connect timeoutquery timeout的链接服务器选项更改为900(15分钟)。但它仍然没有在15分钟后引发错误。

我试图只运行没有SELECTStored Procedure,它会像这样引发一个错误。

Cannot initialize the data source object of OLE DB provider "OraOLEDB.Oracle" for linked server "LinkedServer".

那么,为什么它只在使用SELECT时引发错误,但在Stored Procedure中永远运行?

sql-server stored-procedures linked-server
1个回答
0
投票

关于远程存储过程,我在MSDN上看到了一些有趣的东西。

引自MSDN Handling Errors in Server-to-Server Remote Stored Procedures

  • 当发生语句中止错误时,导致该语句的语句 错误终止,但远程存储过程或批处理的执行继续。

还找到了,

如果本地服务器中的SET XACT_ABORT为ON,则该设置将传播到链接服务器。远程存储过程中的所有语句和批处理中止错误都将转换为本地服务器中的批处理中止错误。因此,调用远程存储过程的批处理或存储过程的执行与远程存储过程一起终止。

因此,您可能需要在存储过程中强加连接级别设置,即SET XACT_ABORT Is ON。并且可能还需要try catch块。

您可以在MSDN上找到详细信息..看看它。

© www.soinside.com 2019 - 2024. All rights reserved.