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. Eu 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á estão bastante prolixo!) Existe uma maneira de executar uma linha elenco / converso dentro da RAISERROR
lista de parâmetros? Ou existe outra maneira de contornar essa deficiência?
Atualização: Então, em última análise, o que eu gostaria de poder fazer é o seguinte:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Infelizmente, RAISERROR
não lida com% f ou flutua em geral. Então, eu tenho que fazer isso:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... que parece uma bagunça quando está espalhada por dezenas de testes de unidade. Então, eu gostaria de resumir a algo como isto:
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?
fonte
Respostas:
Infelizmente, por qualquer motivo, você não pode fazer uma conversão embutida nesse contexto e
RAISERROR
não suporta diretamentefloat
novamente, por qualquer motivo.Para uma conclusão completa desta resposta, aqui está o trecho relevante do MSDN , que eu 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 encerrar a
RAISERROR
chamada. Aqui está um ponto de partida:Infelizmente, não há uma maneira fácil de escalar isso para um número arbitrário de parâmetros ... Provavelmente isso poderia ser feito usando SQL dinâmico aninhado complicado, o que seria divertido de depurar. Vou deixar isso como um exercício para o leitor.
I utilizado
sql_variant
no pressuposto de que, por razões de uniformidade código, o mesmo procedimento poderia ser usado em todos os lugares, mesmo para tipos de valor que são suportados diretamente peloRAISERROR
. Além disso, isso pode ser criado como um procedimento armazenado temporário , se for apropriado.Aqui está a aparência desse procedimento:
Resultado:
Portanto, o resultado líquido é que você não tem capacidade de formatação para carros alegóricos (faça o seu próprio), mas ganha a capacidade de produzi-los (decimal / numérico também!), Mantendo a capacidade de formatação para os outros tipos.
fonte
sql_variant
, então fiquei preso na lista de argumentos e presumi que não era possível. Você me ensinou algo muito útil hoje. Muito obrigado!