SQL Server учитывает культуру / локаль при преобразовании значений в / из строк? - PullRequest
1 голос
/ 14 апреля 2009

Я пытаюсь обновить большую кодовую базу, чтобы правильно указать CultureInfo и / или IFormatProvider при форматировании / разборе значений. Например, при разборе значения, которое я получаю от пользователя, я передаю CultureInfo.CurrentCulture при вызове TryParse, а при преобразовании числа с плавающей запятой в строку для персистентности я передаю CultureInfo.InvariantCulture при вызове ToString.

У меня такой вопрос: при генерации запросов SQL я должен форматировать числа и тому подобное, используя инвариантную культуру, или культуру SQL-сервера, или что? Что сказать, если мой компьютер настроен на немецкий (Германия), какой из этих запросов правильный?

select foo from bar where baz = 123.45

или

select foo from bar where baz = 123,45

Аналогично, если я использую SQL CAST для преобразования значения с плавающей запятой в строку, какую локаль SQL будет использовать для преобразования?

Я провел поиск в документации по SQL, но пока не могу найти хороших ответов. Я нашел некоторую информацию о форматировании даты (SET DATEFORMAT и т. П.), Но это все.

ПРИМЕЧАНИЕ : я понимаю, что предпочтительный способ передачи входных данных в запрос SQL - через параметры, поэтому давайте предположим, что для аргумента у меня есть веская причина отформатировать их в строку запроса. Кроме того, обработка ввода запроса является лишь частью более широкого вопроса.

1 Ответ

4 голосов
/ 14 апреля 2009

Это выдаст ошибку. Язык SQL Server влияет только на значения даты / времени.

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

Я нахожусь в Швейцарии и должен разобраться со всеми этими тремя ...

  • 1,234,56 (DE)
  • 1'234,56 (CH)
  • 1234,56 (EN-GB)
...