编写国际化 Transact-SQL 语句
如果遵循以下指导原则,则使用 Transact-SQL 语句的数据库和数据库应用程序将变得更易于在语言之间移植,或者将支持多种语言:
使用
char
、varchar
和text
替换使用的所有nchar
、nvarchar
和nvarchar(max)
数据类型。 这样做,您就不用考虑代码页转换问题。 有关详细信息,请参阅排序规则和 Unicode 支持。当执行月份和星期的比较与操作时,请使用数值日期,而不要使用名称字符串。 不同的语言设置返回的月份和工作日的名称也不同。 例如,当语言设置为美国英语时,DATENAME(MONTH,GETDATE()) 返回 May,而当语言设置为德语时,返回 Mai,语言设置为法语时则返回 mai。 应使用以数字而非名称表示月份的函数,如 DATEPART。 在生成显示给用户的结果集时,请使用 DATEPART 名称,因为日期名称通常比数值表示形式更有意义。 但是,编写逻辑代码时不要使用任何依赖于特定语言显示的名称。
当指定用于比较的日期,或者指定用于 INSERT 或 UPDATE 语句的输入的日期时,请使用对于所有的语言设置解释方式都相同的常量:
ADO、OLE DB 和 ODBC 应用程序应使用下列 ODBC 时间戳、日期和时间转义子句:
{ ts'yy- mm-ddhh:mm:ss[.fff] '} 例如: { ts'1998- 09-24 10**:02:20' }**
{ d' yyyy - mm - dd '} 例如: { d'1998- 09-24**'}**
{ t' hh : mm : ss '} ,例如: { t'10:02:20'}
使用其他 API 的应用程序或 Transact-SQL 脚本、存储过程和触发器都应使用未分隔数值字符串。 例如 yyyymmdd 为 19980924。
使用其他 API 或 Transact-SQL 脚本、存储过程和触发器的应用程序应将 CONVERT 语句与显式样式参数一起使用,以用于在数据类型
datetime
date
smalldate
和datetimeoffset
字符串数据类型之间time
执行所有转换。 例如,以下语句对于所有语言或日期格式连接设置的解释方式都相同:SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)
有关详细信息,请参阅 CAST 和 CONVERT (Transact-SQL)。