Skip to content

Latest commit

 

History

History
59 lines (45 loc) · 5.42 KB

write-international-transact-sql-statements.md

File metadata and controls

59 lines (45 loc) · 5.42 KB
title description author ms.author ms.date ms.service ms.topic helpviewer_keywords monikerRange
Write International Transact-SQL Statements
Write International Transact-SQL Statements
WilliamDAssafMSFT
wiassaf
04/24/2019
sql
conceptual
writing international statements
Transact-SQL international considerations
international considerations [SQL Server], Transact-SQL
Database Engine international considerations [SQL Server], Transact-SQL
statements [SQL Server], international
database international considerations [SQL Server], Transact-SQL
dates [SQL Server], international considerations
>=aps-pdw-2016||=azuresqldb-current||=azure-sqldw-latest||>=sql-server-2016||>=sql-server-linux-2017||=azuresqldb-mi-current

Write International Transact-SQL Statements

[!INCLUDESQL Server Azure SQL Database Synapse Analytics PDW] Databases and database applications that use [!INCLUDEtsql] statements will become more portable from one language to another, or will support multiple languages, if the following guidelines are followed:

  • Starting with [!INCLUDEsql-server-2019] and in [!INCLUDE ssazure-sqldb], use either:

    • The char, varchar, and varchar(max) data types with a UTF-8 enabled collation, and data is encoded using UTF-8.
    • The nchar, nvarchar, and nvarchar(max) data types with supplementary character (SC) enabled collation, and data is encoded using UTF-16. Using a non-SC collation results in data being encoded using UCS-2.

    This avoids code page conversion issues. For other considerations, see Storage differences between UTF-8 and UTF-16.

  • Up to [!INCLUDEssSQL17], replace all uses of the char, varchar, and varchar(max) data types with nchar, nvarchar, and nvarchar(max). If using a supplementary character (SC) enabled collation, data is encoded using UTF-16. Using a non-SC collation results in data being encoded using UCS-2. This avoids code page conversion issues. For more information, see Collation and Unicode Support.

    [!IMPORTANT] The text data type is deprecated and should not be used in new development work. Plan to convert text data to varchar(max).

  • When doing month and day-of-week comparisons and operations, use the numeric date parts instead of the name strings. Different language settings return different names for the months and weekdays. For example, DATENAME(MONTH,GETDATE()) returns May when the language is set to U.S. English, returns Mai when the language is set to German, and returns mai when the language is set to French. Instead, use a function such as DATEPART that uses the number of the month instead of the name. Use the DATEPART names when you build result sets to be displayed to a user, because the date names are frequently more meaningful than a numeric representation. However, don't code any logic that depends on the displayed names being from a specific language.

  • When you specify dates in comparisons or for input to INSERT or UPDATE statements, use constants that are interpreted the same way for all language settings:

    • ADO, OLE DB, and ODBC applications should use the ODBC timestamp, date, and time escape clauses of:

      { ts' yyyy - mm - dd hh : mm : ss [.fff] '} such as: { ts'1998-09-24 10:02:20'}

      { d' yyyy - mm - dd '} such as: { d'1998-09-24'}

      { t' hh : mm : ss '} such as: { t'10:02:20'}

    • Applications that use other APIs, or [!INCLUDEtsql] scripts, stored procedures, and triggers, should use the unseparated numeric strings. For example, yyyymmdd as 19980924.

    • Applications that use other APIs, or [!INCLUDEtsql] scripts, stored procedures, and triggers should use the CONVERT statement with an explicit style parameter for all conversions between the time, date, smalldate, datetime, datetime2, and datetimeoffset data types and character string data types. For example, the following statement is interpreted in the same way for all language or date format connection settings:

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  

See also

CAST and CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
Collation and Unicode Support