Estou usando RAISERROR()
para fornecer algumas funcionalidades básicas de teste de unidade (como aqui ), mas estou frustrado com a incapacidade de usar FLOATs
na mensagem de erro. Sei que posso converter o float em uma string, mas estou usando RAISERROR
em cada teste de unidade, não quero adicionar outra linha de código para cada teste. (Meus testes de unidade já são prolixos o suficiente!) Existe uma maneira de executar uma conversão/cast inlineRAISERROR
dentro da lista de parâmetros? Ou há outra maneira de contornar essa deficiência?
Atualização: Então, em última análise, o que eu gostaria de fazer é o seguinte:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Infelizmente, RAISERROR
não lida com %f ou floats em geral. Então eu tenho que fazer isso em vez disso:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... que parece uma bagunça quando está espalhado por dezenas de testes de unidade. Então, eu gostaria de resumir para algo assim:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Mas isso me dá uma Incorrect syntax near 'CAST'
mensagem. Não entendo por que isso é ilegal, mas é. Existe outro "one liner" que eu poderia usar aqui?
Infelizmente, por qualquer motivo, você não pode fazer uma conversão em linha nesse contexto e
RAISERROR
não suporta diretamentefloat
, novamente, por qualquer motivo.Para completar esta resposta, aqui está o trecho relevante do MSDN , que tenho certeza que você já viu (nota: é o mesmo texto em todas as versões da documentação de 2005 a 2012):
A única solução razoável em que posso pensar seria escrever um procedimento armazenado para agrupar a
RAISERROR
chamada. Aqui está um ponto de partida:Infelizmente, não há uma maneira fácil de dimensionar isso para um número arbitrário de parâmetros... Provavelmente poderia ser feito usando SQL dinâmico aninhado complicado, o que seria divertido depurar. Vou deixar isso como um exercício para o leitor.
Usei
sql_variant
a suposição de que, por motivos de uniformidade de código, o mesmo procedimento seria usado em todos os lugares, mesmo para tipos de valor suportados diretamente porRAISERROR
. Além disso, isso pode ser criado como um procedimento armazenado temporário , se for apropriado.Veja como ficaria usando este procedimento:
Resultado:
Portanto, o resultado líquido é que você não obtém capacidade de formatação para floats (role o seu próprio), mas ganha a capacidade de produzi-los (decimal/numérico também!) Enquanto mantém a capacidade de formatação para os outros tipos.