出于某种原因,我不能只在特定的服务器连接捉相关的错误。
还有就是通过链接服务器2 SQL-Server之间的通信。有时接触不良而其结果是出现以下错误:
TCP提供:指定的网络名称不再可用。
我曾经的try-catch来处理这个问题,并且由于严重程度是不高于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
该过程将导致以下错误:
OLE DB提供程序“STREAM”链接服务器“(空)”返回了消息“议定书TDS流错误”。 OLE DB提供程序“STREAM”链接服务器“(空)”返回了消息“通讯链接失败”。消息64,级别16,状态1,行0提供的TCP:指定的网络名称不再可用。 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服务器:2008 R2标准版(64位)
我不明白为什么我不能赶上下面的错误。
编辑:问题在于超越了存储过程的执行。即使我执行是这样的:
EXEC ('Select * from SomeTable') at LinkedServer
有时(的情况下,小于0.1%),我将获得提到的错误。我试图找到某种模式,但到目前为止没有运气。另外,我搜索是否有某种网络配置可能被杀死查询,但结果却是否定的。
尝试使用动态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,似乎原因是编译时错误。