我在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 timeout
和query 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
中永远运行?
关于远程存储过程,我在MSDN上看到了一些有趣的东西。
引自MSDN Handling Errors in Server-to-Server Remote Stored Procedures
还找到了,
如果本地服务器中的SET XACT_ABORT为ON,则该设置将传播到链接服务器。远程存储过程中的所有语句和批处理中止错误都将转换为本地服务器中的批处理中止错误。因此,调用远程存储过程的批处理或存储过程的执行与远程存储过程一起终止。
因此,您可能需要在存储过程中强加连接级别设置,即SET XACT_ABORT Is ON
。并且可能还需要try catch块。
您可以在MSDN上找到详细信息..看看它。