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

时间:2019-04-12 05:32:56

标签: sql-server stored-procedures linked-server

我在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分钟后它仍然没有引发错误。

我尝试仅运行SELECT,而没有运行Stored Procedure,这会引起类似的错误。

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

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

1 个答案:

答案 0 :(得分:0)

我在MSDN上看到了一些有关远程存储过程的有趣信息。

从MSDN Handling Errors in Server-to-Server Remote Stored Procedures 引用

  •   

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

也找到了

  

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

因此,您可能需要在存储过程中施加连接级别设置,即SET XACT_ABORT Is ON。并且可能还需要尝试捕获块。

您可以找到有关MSDN的详细信息。请看一下。