Tenho uma dúvida sobre este violino:
DECLARE @TestVal AS float = 8.88;
SELECT flt = @TestVal
, xml = (SELECT Value = @TestVal FOR XML PATH(''), TYPE)
, fmt17 = FORMAT(@TestVal, 'G17')
, fmt = FORMAT(@TestVal, 'G')
, cst = CAST(@TestVal AS nvarchar(50))
, fmt17_roundtrip = CAST(FORMAT(@TestVal, 'G17') AS float)
, fmt_roundtrip = CAST(FORMAT(@TestVal, 'G') AS float)
, cst_roundtrip = CAST(CAST(@TestVal AS nvarchar(50)) AS float)
;
https://dbfiddle.uk?rdbms=sqlserver_2019&fiddle=0cf05f882eb24f53e9484f043af99446
Eu estava tendo problemas com alguns XML saindo por padrão em notação científica que, embora não seja incorreto ou impreciso, não é muito legível.
Eu estava originalmente usando FORMAT(floatcol, 'G17') por causa dos comentários nesta página de documentação que:
Observe que, quando usado com um valor Double, o especificador de formato "G17" garante que o valor Double original seja executado com êxito. Isso ocorre porque Double é um número de ponto flutuante de precisão dupla (binary64) compatível com IEEE 754-2008 que fornece até 17 dígitos significativos de precisão. Recomendamos seu uso em vez do especificador de formato "R", pois, em alguns casos, "R" não consegue executar com êxito valores de ponto flutuante de precisão dupla de ida e volta. O exemplo a seguir ilustra um desses casos.
Bem, hoje descobri que parece adicionar alguns dígitos extras insignificantes à string. Neste exemplo em particular, todos eles "ida e volta" bem, mas o formato G17 tem um dígito extra insignificante.
E apesar do fato de que isso pode não me afetar em uma viagem de ida e volta, eu realmente não quero enviar isso para outra parte com dígitos extras.
Agora estou inclinado a mudar para FORMAT('G'), mas não tenho certeza das implicações disso. Atualmente, a string de formato usada nessas exportações XML é uma definição de configuração armazenada em meu sistema, portanto, é mais fácil continuar usando FORMAT, pois não requer alterações de código.
Portanto, antes de testar vários outros valores, minha pergunta é qual é a diferença entre G e G17 em geral e quais problemas posso encontrar usando G em vez de G17?
(Sim, este valor precisa ser um float, não um decimal ou inteiro ou moeda, e o domínio do float pode variar por diferentes medidas/contextos).
O sistema precisa ser executado em 2012 e superior.
Desculpe, não sei sobre isso, mas você pode tentar fazer algo com o XML. Não tenho certeza se isso é algo que você poderia usar, mas aqui está de qualquer maneira.
Ao lidar com XML digitado, você não obterá a notação científica para o seu valor, você obterá para outros valores. Portanto, use XML tipado e atribua o XML resultante a uma variável XML vinculada ao esquema usando xs:double para precisão dupla.
Aqui está um esquema.
E uma consulta usando o esquema.
Resultado:
Outra maneira de corrigi-lo com XML é obter o valor flutuante em XML e, em seguida, usar o XML como um valor para a consulta XML. Agora isso soa mais complicado do que é, espero.
Resultado
Aqui está um pouco de código mostrando a saída diferente que você obtém para diferentes soluções. Dependendo dos valores, você eventualmente obterá a notação científica para todos os métodos.
Resultados:
ScienceAllTheWay
Usando ASchema
XMLTrickery
Formato G
Formato G17