GSe*_*erg 6 sql-server-2012 format
这现已发布到 Connect:SQL Server 2012 中的 FORMAT() 函数拒绝了不变区域性标识符。(Connect 已停用。)
现已发布到feedback.azure.com。
我正在尝试让format()
SQL Server 2012 中的内置函数使用不变区域性。
文档中说该函数接受 .NET 区域性标识符作为第三个参数。不变区域性的标识符是一个空字符串:
您可以通过
""
在调用CultureInfo
实例化方法时使用空字符串 ( )按名称指定不变区域性。
但是,这不适用于 SQL Server:
Run Code Online (Sandbox Code Playgroud)select format(getdate(), N'g', '');
消息 9818,级别 16,状态 1,第 1 行
函数调用中提供的区域性参数 '' 不受支持。
还记录了不变文化与英语相关联,但与任何国家/地区无关。有人会认为这允许'en'
作为标识符传递,但是,在 .NET 中,CultureInfo.InvariantCulture.Equals(CultureInfo.GetCultureInfo(""))
yields true
,但CultureInfo.InvariantCulture.Equals(CultureInfo.GetCultureInfo("en"))
Gives false
,所以它们实际上并不相同。
那么如何让 SQL Server 使用不变文化呢?
(注意:我有兴趣使内置的东西工作。我已经有了自己的 CLR 函数来做到这一点,我打算删除它们以支持现在的内置功能)。
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
2012 年 12 月 28 日 20:23:12
版权所有 (c)
Windows NT 6.0 上的Microsoft Corporation商业智能版(64 位)(Build 6002:Service Pack 2)(管理程序) )
小智 3
我发现只有一种方法可以FORMAT
使用不变区域性:传递一个以空字符开头的字符串作为参数culture
。
\n\n\nRun Code Online (Sandbox Code Playgroud)\n\n-- Setting session language to Traditional Chinese to demonstrate that this\n-- isn\'t just falling back to the session language.\nSET LANGUAGE N\'Traditional Chinese\';\nPRINT N\'Session Language: \' + FORMAT(SYSDATETIME(), N\'Y\'); \nPRINT N\'US English: \' + FORMAT(SYSDATETIME(), N\'Y\', N\'en-US\');\nPRINT N\'Invariant Culture: \' + FORMAT(SYSDATETIME(), N\'Y\', NCHAR(0));\n
\n 输出:\n\n\n会话语言: 2013\xe5\xb9\xb49\xe6\x9c\x88\n美国英语: 2013 年 9 月\n不变文化: 2013 年 9 月\n\n
(上面的示例使用“年月”格式字符串,\'Y\'
因为它在 en-US 和固定区域性之间产生不同的输出。)
这是由于 .NET 实现CultureInfo
查找区域性数据的方式似乎有些奇怪。它所做的字符串比较似乎忽略了空字符后面的任何数据,可能是因为它们是通过用于空终止字符串的函数在 CLR 的本机代码中完成的。因此,它将以空字符开头的字符串视为等同于空字符串,正如您所指出的,它是不变区域性的记录标识符。
-- Setting session language to Traditional Chinese to demonstrate that this\n-- isn\'t just falling back to the session language.\nSET LANGUAGE N\'Traditional Chinese\';\nPRINT N\'Session Language: \' + FORMAT(SYSDATETIME(), N\'Y\'); \nPRINT N\'US English: \' + FORMAT(SYSDATETIME(), N\'Y\', N\'en-US\');\nPRINT N\'Invariant Culture: \' + FORMAT(SYSDATETIME(), N\'Y\', NCHAR(0));\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n免责声明:这显然是相当黑客行为,因为这种行为既没有记录在案FORMAT
,也没有记录在案CultureInfo
。我只在运行 .NET 4.0.3 的 SQL Server 2012 上尝试过此操作。我个人不会依赖这种行为来处理任何无法轻易更改的行为(如果它因未来更新而停止工作)。
归档时间: |
|
查看次数: |
12970 次 |
最近记录: |