O SQL Server considerar cultura / localidade ao converter valores de / para cordas?

StackOverflow https://stackoverflow.com/questions/745652

  •  09-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando atualizar um grande base de código para especificar corretamente o CultureInfo e / ou IFormatProvider ao formatar / analisar valores. Por exemplo, ao analisar um valor que recebo do usuário, eu passar CultureInfo.CurrentCulture ao chamar TryParse, e ao converter um float para uma string para a persistência, eu passo CultureInfo.InvariantCulture ao chamar ToString.

A minha pergunta é esta: ao gerar consultas SQL, devo formatar números e afins usando a cultura invariável, ou cultura do servidor SQL, ou o quê? O que quer dizer, se meu computador está definido para alemão (Alemanha), qual destas consultas é certo?

select foo from bar where baz = 123.45

ou

select foo from bar where baz = 123,45

Da mesma forma, se eu usar CAST de SQL para converter um valor de ponto flutuante para uma cadeia, o que localidade é SQL vai usar para a conversão?

Eu fiz procurar os docs SQL, mas até agora eu não posso encontrar qualquer boas respostas. Eu fiz encontrar algumas informações sobre formatação de data (DATEFORMAT SET e afins), mas é isso.

NOTA : Eu percebo que a melhor maneira de passar as entradas para uma consulta SQL é através de parâmetros, então vamos supor que por causa do argumento que eu tenho uma boa razão para formatá-los para a string de consulta. Além disso, as entradas de consulta entregar é apenas uma parte da questão mais ampla.

Foi útil?

Solução

Ele irá lançar um erro. A linguagem do SQL Server afecta apenas os valores Data / Hora.

SET LANGUAGE Deutsch
SELECT 'true' WHERE 1 <> 123,45

--gives
Msg 102, Level 15, State 1, Line 2
Falsche Syntax in der Nähe von ','.
There is far too much ambiguity in number formats

SET LANGUAGE Deutsch
SELECT 'true' WHERE 1 <> 123.45
--gives true

Eu estou na Suíça e tem que lidar com todos os 3 destes ...

  • 1.234,56 (DE)
  • 1'234,56 (CH)
  • 1,234.56 (EN-GB)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top