Написание инструкций Transact-SQL, адаптированных к международному использованию
Базы данных и приложения базы данных, использующие инструкции Transact-SQL, становятся более переносимыми с одного языка на другой или поддерживают несколько языков, если следуют следующие рекомендации:
Все элементы с типами данных
char
,varchar
иtext
замените элементами с типами данныхnchar
,nvarchar
иnvarchar(max)
. Такая замена устраняет возможные проблемы с преобразованием кодовых страниц. Дополнительные сведения см. в статье Collation and Unicode Support.При выполнении сравнения и других операций со значениями месяцев и дней недели следует использовать числовые эквиваленты вместо строковых имен. При различных языковых настройках возвращаются различные названия месяцев и дней недели. Например, функция DATENAME(MONTH,GETDATE()) при выбранном английском (США) языке возвращает значение «May», при немецком — «Mai», а при французском — «mai». Вместо нее следует использовать функцию наподобие DATEPART, в которой вместо названия месяца используется его номер. При выводе результирующих наборов пользователю лучше использовать названия из функции DATEPART(), так как они зачастую более информативны, чем числовое представление даты. Однако не следует кодировать какую-либо логику, зависящую от отображаемых названий на том или ином языке.
При указании дат для сравнения либо ввода с помощью инструкций INSERT или UPDATE следует использовать константы, интерпретируемые одним и тем же образом для всех языковых настроек.
В приложениях ADO, OLE DB и ODBC следует использовать принятые в ODBC форматы отметок времени, даты и времени:
{ ts'yyyy mm-ddhh:mm-:ss[.fff] '} например: { ts'1998- 09-24 10*:02:20' }**
{ d' гггг - мм - дд '} например: { d'1998- 09-24**'}**
{ t' hh : mm : ss '} например: { t'10:02:20'}
Приложения, использующие другие API-интерфейсы или скрипты Transact-SQL, хранимые процедуры и триггеры, должны использовать неуправляемые числовые строки. Например, yyyymmdd в виде 19980924.
Приложения, использующие другие API или скрипты Transact-SQL, хранимые процедуры и триггеры, должны использовать инструкцию CONVERT с явным параметром стиля для всех преобразований между
time
типами данных , , ,datetime
smalldate
date
, datetime2 иdatetimeoffset
символьными строками данных. Например, следующая инструкция интерпретируется одинаково для любых настроек языка и формата даты в соединении:SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)
Дополнительные сведения см. в разделе Функции CAST и CONVERT (Transact-SQL).