无法捕获链接服务器之间的连接错误

时间:2019-01-10 12:00:47

标签: sql-server sql-server-2008 linked-server

由于某些原因,我无法仅在特定服务器中捕获与连接有关的错误。

2个SQL Server之间通过链接服务器进行通信。有时连接不好,结果是出现以下错误:

TCP Provider:指定的网络名称不再可用。

我具有尝试捕获功能来处理此问题,并且由于严重性不高于20,所以一切正常。

BEGIN TRY
DECLARE @return_value int

EXEC    @return_value = [dbo].[sp_someSP]

SELECT  'Return Value' = @return_value

END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE(),ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_PROCEDURE()
--NEVER GOES HERE!!!
END CATCH

该过程将导致以下错误:

  

链接服务器“(null)”的OLE DB提供程序“ STREAM”返回了消息   “ TDS流中的协议错误”。 OLE DB提供程序“ STREAM”用于链接   服务器“(null)”返回消息“通信链接失败”。讯息64,   级别16,状态1,第0行TCP Provider:指定的网络名称为   不再可用。链接服务器的OLE DB提供程序“ STREAM”   “(空)”返回消息“查询超时已过期”。

我测试了链接服务器并可以正常工作(甚至重新创建了链接服务器)

Linked Server Configuration:

@optname=N'collation compatible', @optvalue=N'false'

@optname=N'data access', @optvalue=N'true'

@optname=N'dist', @optvalue=N'false'

@optname=N'pub', @optvalue=N'false'

@optname=N'rpc', @optvalue=N'true'

@optname=N'rpc out', @optvalue=N'true'

@optname=N'sub', @optvalue=N'false'

@optname=N'connect timeout', @optvalue=N'100'

@optname=N'collation name', @optvalue=null

@optname=N'lazy schema validation', @optvalue=N'false'

@optname=N'query timeout', @optvalue=N'100'

@optname=N'use remote collation', @optvalue=N'true'

@optname=N'remote proc transaction promotion', @optvalue=N'false'

SQL Server:2008 R2标准版(64位)

我不明白为什么我无法捕获以下错误。

编辑:问题不仅仅在于存储过程的执行。即使我执行这样的事情:

EXEC ('Select * from SomeTable') at LinkedServer

有时(少于0.1%的情况),我会遇到上述错误。 我正在尝试找到某种模式,但到目前为止还没有运气。另外,我搜索了是否存在某种网络配置可能会杀死查询,但结果是否定的。

1 个答案:

答案 0 :(得分:0)

尝试像这样使用动态SQL:

BEGIN TRY
    DECLARE @sql VARCHAR(1000) = 'EXEC [YourDatabase].[dbo].[sp_someSP]';   
    EXEC (@sql) AT [YourServer];
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

或者像这样上一级:

BEGIN TRY
    DECLARE @sql VARCHAR(1000) = 
       'EXEC (''EXEC [YourDatabase].[dbo].[sp_SomeSP] 
       ''''Parameter1'''', ''''Parameter2'''''') AT [YourLinkedServer]';
    PRINT @sql
    EXEC (@sql); 

END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

请参见this answer,看来原因是编译时错误。