由于某些原因,我无法仅在特定服务器中捕获与连接有关的错误。
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%的情况),我会遇到上述错误。 我正在尝试找到某种模式,但到目前为止还没有运气。另外,我搜索了是否存在某种网络配置可能会杀死查询,但结果是否定的。
答案 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,看来原因是编译时错误。