【问题标题】:Supported ISO language codes in SQL serverSQL Server 中支持的 ISO 语言代码
【发布时间】: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)" 和 TwoLetterISOLanguageName of iv 的文化。
  • .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


【解决方案1】:

根据马丁的回答,这因环境而异。 丑陋的方法会起作用,但内部表中的列表会很好。

drop table if exists #SupportedLanguages;
create table #SupportedLanguages(Lang varchar(2));
declare c cursor fast_forward local for
select concat(a.value,b.value)
from string_split('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z',',')a
    cross apply string_split('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z',',')b
open c;

declare @c varchar(2), @cmd varchar(100);
fetch next from c into @c;

while @@FETCH_STATUS = 0
begin
    select @cmd = concat('select format(current_timestamp,''dd-MMMM-yyyy'',''', @c, ''')')
    begin try
        exec(@cmd);
        insert into #SupportedLanguages values(@c);
    end try
    begin catch
    end catch
    fetch next from c into @c;
end;

close c;
deallocate c;

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 2011-01-02
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2015-09-26
    • 2011-07-06
    • 2015-06-20
    相关资源
    最近更新 更多