我在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
中永远运行会引发错误?
答案 0 :(得分:0)
我在MSDN上看到了一些有关远程存储过程的有趣信息。
从MSDN Handling Errors in Server-to-Server Remote Stored Procedures 引用
当语句中止错误发生时,导致 错误被终止,但是远程存储过程的执行 或批次继续。
也找到了
如果本地服务器中的SET XACT_ABORT为ON,则会传播设置 到链接的服务器。所有语句和批处理中止错误 远程存储过程将转换为批量中止错误 本地服务器。因此,执行批处理或存储过程 被称为远程存储过程的终止与 远程存储过程。
因此,您可能需要在存储过程中施加连接级别设置,即SET XACT_ABORT Is ON
。并且可能还需要尝试捕获块。
您可以找到有关MSDN的详细信息。请看一下。