Estou trabalhando com o SQL Server 2012 Enterprise Edition SP2 em um Windows 7 32 bits.
Eu tenho esse código dentro de um procedimento armazenado.
Begin try
-- EXEC CLR Stored Procedure
exec dbo.MyStoredProcedureCLR @baseUrl, @orderNumber
end try
begin catch
Declare @message nvarchar(max);
set @message = ERROR_MESSAGE()
EXEC master..xp_logevent 60000, @message, informational
end catch
MyStoredProcedureCLR
é um SQL CLR Stored Procedure que faz um PUT para um serviço web RESTful.
Às vezes, recebo uma 404 Not Found
exceção e quero capturá-la e registrá-la. Esta é a mensagem que recebo:
A .NET Framework error occurred during execution of user-defined routine or aggregate "GetNewCodesICODECLR":
System.Net.WebException: Error en el servidor remoto: (404) No se encontró.
System.Net.WebException:
en System.Net.HttpWebRequest.GetResponse()
en StoredProcedures.GetNewCodesICODECLR(SqlString baseUrl, SqlString orderNumber, SqlString lineCode, Int64 quantity, Int64 codesPrinted, Int64 codesCleared)
Mas, quando recebo essa exceção, recebo outra exceção em xp_logevent
:
'Erro ao executar o procedimento armazenado estendido: tipo de parâmetro inválido'
Como posso saber se ERROR_MESSAGE()
é um parâmetro válido? OU o que está acontecendo?
A propósito, estou executando um procedimento armazenado SQL CLR dentro de uma fila do Service Broker.
Do tópico na
xp_logevent
documentação :Então, eu mudaria isso:
Para isso:
Ou possivelmente até não-Unicode (os documentos não são claros):
Além disso, a gravidade deve ser delimitada como uma string adequada (apesar do terrível exemplo nos documentos) e em letras maiúsculas (caso isso importe em um agrupamento com distinção entre maiúsculas e minúsculas, quem sabe o que aqueles codificadores do XP de cowboy podem ter feito):
Seu procedimento CLR não é relevante aqui...