Van*_*nel 1 sql-server logs sql-clr
我正在 Windows 7 32 位上使用 SQL Server 2012 Enterprise Edition SP2。
\n\n我在存储过程中有这段代码。
\n\nBegin try\n -- EXEC CLR Stored Procedure\n exec dbo.MyStoredProcedureCLR @baseUrl, @orderNumber\nend try\nbegin catch\n Declare @message nvarchar(max);\n\n set @message = ERROR_MESSAGE()\n EXEC master..xp_logevent 60000, @message, informational\nend catch\n
Run Code Online (Sandbox Code Playgroud)\n\nMyStoredProcedureCLR
是一个 SQL CLR 存储过程,用于对 RESTful Web 服务进行 PUT。
有时,我会遇到404 Not Found
异常,我想捕获它并记录它。这是我收到的消息:
A .NET Framework error occurred during execution of user-defined routine or aggregate "GetNewCodesICODECLR": \nSystem.Net.WebException: Error en el servidor remoto: (404) No se encontr\xc3\xb3.\nSystem.Net.WebException: \n en System.Net.HttpWebRequest.GetResponse()\n en StoredProcedures.GetNewCodesICODECLR(SqlString baseUrl, SqlString orderNumber, SqlString lineCode, Int64 quantity, Int64 codesPrinted, Int64 codesCleared)\n
Run Code Online (Sandbox Code Playgroud)\n\n但是,当我得到这个异常时,我得到另一个异常xp_logevent
:
\'执行扩展存储过程时出错:参数类型无效\'
\n\n我如何知道 是否ERROR_MESSAGE()
是有效参数?或者发生了什么?
顺便说一句,我正在 Service Broker 队列中运行一个 SQL CLR 存储过程。
\n'message'
是最多 2048 个字符的字符串。
所以,我会改变这一点:
Declare @message nvarchar(max);
Run Code Online (Sandbox Code Playgroud)
对此:
Declare @message nvarchar(2048);
Run Code Online (Sandbox Code Playgroud)
或者甚至可能是非 Unicode(文档不清楚):
Declare @message varchar(2048);
Run Code Online (Sandbox Code Playgroud)
另外,严重性应该被分隔为一个正确的字符串(尽管文档中的例子很糟糕),并且是大写的(如果它对区分大小写的排序规则很重要,谁知道那些牛仔 XP 编码员可能做了什么):
EXEC master.sys.xp_logevent 60000, @message, 'INFORMATIONAL';
Run Code Online (Sandbox Code Playgroud)
您的 CLR 过程与此处无关...