/**/
/*--SETNOCOUNT的问题
SQL版本:SQLServer20053159
故障描述:
当满足下述条件时,SETNOCOUNT导致TRY...CATCH无法正确处理错误
1.使用EXEC(<SQl>)AT<LinkedServer>或者EXEC<LinkedServer>.<databasename>.dbo.sp_executesql<SQl>
2.<SQL>中包括输出参数
3.<SQL>中包括SETNOCOUNTON和USE<DatabaseName>语句(注意不能更换出现次序)
具体的参考下面的测试示例
与此问题相关的帖子:
http://topic.youkuaiyun.com/u/20080103/12/3dafc07c-3376-40c1-b4bd-7cbd76afed1a.html?seed=182508736
--*/
--
添加链接服务器
EXEC
sp_addlinkedserver
'
srv_lnk
'
,
''
,
'
SQLOLEDB
'
,
'
.
'
EXEC
sp_serveroption
'
srv_lnk
'
,
'
rpcout
'
,
'
true
'
GO

--
测试语句
--
SETNOCOUNTON
BEGIN
TRY
DECLARE
@error_number
int
,
@error_message
nvarchar
(
2048
)
EXEC
(N
'
SETNOCOUNTON
USEtempdb
BEGINTRY
DELETEFROM[NEWID()]
ENDTRY
BEGINCATCH
SELECT
?=ERROR_NUMBER(),
?=ERROR_MESSAGE()
ENDCATCH
'
,
@error_number
OUTPUT,
@error_message
OUTPUT
)ATsrv_lnk
END
TRY
BEGIN
CATCH
SELECT
2
,
ERROR_NUMBER(),
ERROR_MESSAGE()
END
CATCH
GO

--
删除链接服务器
EXEC
sp_dropserver
'
srv_lnk
'
,
'
droplogins
'
GO
本文介绍了一个SQL Server 2005中的SETNOCOUNT特性导致TRY...CATCH错误处理机制失效的问题。该问题发生在特定条件下:通过链接服务器执行包含输出参数和SETNOCOUNT ON指令的SQL语句时。文中提供了复现问题的测试案例。

3791

被折叠的 条评论
为什么被折叠?



