Sql server 如何在T-SQL表值函数中切换语言

Sql server 如何在T-SQL表值函数中切换语言,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,我需要在表值函数体中的语言之间切换,以返回不同语言的月份名称和工作日。但是,当我尝试使用SET语言俄语时,我在函数中使用了无效的副作用运算符“SET COMMAND”。错误 为什么在TVF中设置变量时会发生这种情况?如何更改TVFs中的语言?您不能在函数中使用设置语言 你的版本是什么 如果2012+你能做到 SELECT FORMAT (GETDATE(), 'dddd', 'ru-RU'), FORMAT (GETDATE(), 'MMMM', 'ru-RU') 相反。(在回

我需要在表值函数体中的语言之间切换,以返回不同语言的月份名称和工作日。但是,当我尝试使用
SET语言俄语时,我在函数中使用了
无效的副作用运算符“SET COMMAND”。
错误


为什么在TVF中设置变量时会发生这种情况?如何更改TVFs中的语言?

您不能在函数中使用
设置语言

你的版本是什么

如果2012+你能做到

SELECT FORMAT (GETDATE(), 'dddd', 'ru-RU'), 
       FORMAT (GETDATE(), 'MMMM', 'ru-RU')
相反。(在回答当天返回


在以前的版本中,您可以编写类似的CLR函数。

在2012年之前的版本中,您可以使用
sys.syslanguages
表提取月份名称,例如:

CREATE VIEW dbo.MonthNameByLanguage
AS
    WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (N)),
    Numbers (Number) AS (SELECT ROW_NUMBER() OVER(ORDER BY N1.N) FROM N1 AS N1 CROSS JOIN N1 AS N2)
    SELECT  l.langid,
            languageName = l.name,
            l.alias,
            MonthNumber = ROW_NUMBER() OVER(PARTITION BY l.[langid] ORDER BY n.Number),
            [MonthName] = SUBSTRING(l.months, n.Number, CHARINDEX(',', l.months + ',', n.Number) - n.Number)
    FROM    sys.syslanguages AS l
            INNER JOIN Numbers AS n
                ON (SUBSTRING(l.months, n.Number -1, 1) = ',' OR n.Number = 1);
这只是从系统视图中获取逗号分隔的月份名称,并使用数字表将其拆分出来。然后,您可以在函数中使用它作为:

SELECT  MonthName
FROM    dbo.MonthNameByLanguage
WHERE   alias = 'RUSSIAN'
AND     MonthNumber = 3;
不过,一般来说,我会尽可能晚地进行格式化,只需将日期传递到演示层,然后让区域设置处理格式化

您还可以对日名称执行类似操作:

CREATE VIEW dbo.DayNameByLanguage
AS
    WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (N)),
    Numbers (Number) AS (SELECT ROW_NUMBER() OVER(ORDER BY N1.N) FROM N1 AS N1 CROSS JOIN N1 AS N2)
    SELECT  l.langid,
            languageName = l.name,
            l.alias,
            DayNumber = ROW_NUMBER() OVER(PARTITION BY l.[langid] ORDER BY n.Number),
            [DayName] = SUBSTRING(l.days, n.Number, CHARINDEX(',', l.days + ',', n.Number) - n.Number)
    FROM    sys.syslanguages AS l
            INNER JOIN Numbers AS n
                ON (SUBSTRING(l.days, n.Number -1, 1) = ',' OR n.Number = 1);

太好了,马丁!谢谢!这非常适合我。我是2014 btw。谢谢你的回答,Gareth!看起来2012+在减少代码量方面取得了巨大进步。一点问题都没有。我最多只能将我的技术描述为一种黑客行为,它使用的是SQL Server中的系统表,可能与它们的意图不同。但是,是的,在2012+中引入的,在这种情况下,您的生活会轻松很多!