【发布时间】:2022-01-25 04:25:00
【问题描述】:
• 如何根据我使用的版本列出支持的区域 ISO 代码?
我需要检查 ISO 639-1(2 个字符)语言代码是否受支持。 对于 2019 年之前的版本,您不会收到默认回复。它会引发错误。
需求示例:
select format(current_timestamp,'dd-MMMM-yyyy','es')
select format(current_timestamp,'dd-MMMM-yyyy','mn')
select format(current_timestamp,'dd-MMMM-yyyy','ii')
select format(current_timestamp,'dd-MMMM-yyyy','oo')
select format(current_timestamp,'dd-MMMM-yyyy','qq')
以上将在 (my) v.2016 上返回 2 个错误 – 不支持函数调用中提供的区域性参数“oo”。 不支持函数调用中提供的culture参数'qq'。
这与 sys.syslanguages 中列出的定义不匹配 而且该表也不包括iso代码。
谢谢!
【问题讨论】:
-
查看 Formatting types 获取文档
-
我没有看到在我的本地 2016 实例上运行
format(current_timestamp,'dd-MMMM-yyyy','qq')的错误。我怀疑它将取决于操作系统。CultureInfo.CreateSpecificCulture("qq")最终在我的开发机器上的 .net 控制台应用程序中为我创建了一个具有 DisplayName "Invariant Language (Invariant Country)" 和TwoLetterISOLanguageNameofiv的文化。 -
.NET 标记添加是因为 SQL Server
format函数是通过调用 CLR 实现的(我想它与“DateTime.Now.ToString("dd-MMMM-yyyy", new CultureInfo("qq"))在什么情况下工作)基本相同的 Q” -
答案将是“不容易”,除非您真的愿意编写和部署 CLR 函数,这对于这种特定场景来说似乎有点矫枉过正。有关运行时接受哪些语言代码的信息根本不会反映在 SQL Server 本身中。如果您确实需要此功能(使用可变文化),则建议您一开始不应该在 SQL Server 中执行此操作 - 实际上,对于最终用户消费的格式化值而言,这确实是正确的。这种事情在客户端管理起来要容易得多。
-
@MartinSmith:嗯,总是有源代码和反编译器...我并不是要暗示
CultureInfo.GetCultures会给出“接受的”值列表,但是有“a ” 可以(至少在理论上)使用 .NET 提取的此类行为列表,即使在理论上仅从 SQL Server 也是不可能的(除非通过繁琐的尝试所有可能的组合,如当前答案中所做的那样)。请注意,qq是否以某种形式或方式被接受的问题应该是学术性的,因为qq是未分配的,所以我们真的在定义未定义的行为之后。
标签: .net sql-server tsql globalization iso-639