如何让 SQL Server 2012 使用 format() 中的不变区域性?

GSe*_*erg 6 sql-server-2012 format

这现已发布到 Connect:SQL Server 2012 中的 FORMAT() 函数拒绝了不变区域性标识符(Connect 已停用。)
现已发布到feedback.azure.com


我正在尝试让format()SQL Server 2012 中的内置函数使用不变区域性。

文档中说该函数接受 .NET 区域性标识符作为第三个参数。不变区域性标识符是一个空字符串:

您可以通过""在调用CultureInfo实例化方法时使用空字符串 ( )按名称指定不变区域性。

但是,这不适用于 SQL Server:

select format(getdate(), N'g', '');
Run Code Online (Sandbox Code Playgroud)

消息 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
\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
Run Code Online (Sandbox Code Playgroud)\n\n


\n 输出:

\n\n

\n会话语言: 2013\xe5\xb9\xb49\xe6\x9c\x88\n美国英语: 2013 年 9 月\n不变文化: 2013 年 9 月\n
\n
\n\n

(上面的示例使用“年月”格式字符串,\'Y\'因为它在 en-US 和固定区域性之间产生不同的输出。)

\n\n

这是由于 .NET 实现CultureInfo查找区域性数据的方式似乎有些奇怪。它所做的字符串比较似乎忽略了空字符后面的任何数据,可能是因为它们是通过用于空终止字符串的函数在 CLR 的本机代码中完成的。因此,它将以空字符开头的字符串视为等同于空字符串,正如您所指出的,它是不变区域性的记录标识符。

\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
Run Code Online (Sandbox Code Playgroud)\n\n


\n免责声明:这显然是相当黑客行为,因为这种行为既没有记录在案FORMAT,也没有记录在案CultureInfo。我只在运行 .NET 4.0.3 的 SQL Server 2012 上尝试过此操作。我个人不会依赖这种行为来处理任何无法轻易更改的行为(如果它因未来更新而停止工作)。

\n