O SQL Server considerar cultura / localidade ao converter valores de / para cordas?
-
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.
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)