我想在函数中使用 DATENAME
,但问题是 datename 的结果取决于登录或安装语言设置。
为了确保它始终返回英语结果,我需要使用设置语言“英语”
,但如果我在函数内使用它,我会收到以下错误
Invalid use of a side-effecting operator 'SET COMMAND' within a function.
最佳答案
对于使用 SQL Server 2012 或更高版本的任何人来说,通过 FORMAT
函数可以非常轻松地完成此操作,如下所示:
SET LANGUAGE 'English';
DECLARE @TestDate DATETIME;
SET @TestDate = '2015-06-23';
SELECT FORMAT(@TestDate, 'dddd'); -- Tuesday
SELECT FORMAT(@TestDate, 'dddd', 'en-us'); -- Tuesday
SELECT FORMAT(@TestDate, 'dddd', 'ru-RU'); -- вторник
SELECT FORMAT(@TestDate, 'dddd', 'fa-IR'); -- سه شنبه
SET LANGUAGE 'French';
SELECT FORMAT(@TestDate, 'dddd'); -- mardi
SELECT FORMAT(@TestDate, 'dddd', 'en-us'); -- Tuesday
SELECT FORMAT(@TestDate, 'dddd', 'ru-RU'); -- вторник
SELECT FORMAT(@TestDate, 'dddd', 'fa-IR'); -- سه شنبه
但是那些仍在使用 SQL Server 2005、2008 或 2008 R2 的人呢?好吧,使用 SQLCLR 也可以完成同样的事情。事实上,SQL Server 2012 中引入的 FORMAT 函数(即上面所示的函数)正在幕后使用 SQLCLR。因此,您可以编写一个简单的 CLR UDF 来执行此操作,也可以简单地下载 SQL#库(我是该库的作者,但此函数在免费版本中可用)并使用 Date_Format
函数,如下所示:
SET LANGUAGE 'English';
DECLARE @TestDate DATETIME;
SET @TestDate = '2015-06-23';
SELECT SQL#.Date_Format(@TestDate, 'dddd', ''); -- Tuesday
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'en-us'); -- Tuesday
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'ru-RU'); -- вторник
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'fa-IR'); -- سه شنبه
SET LANGUAGE 'French';
SELECT SQL#.Date_Format(@TestDate, 'dddd', ''); -- Tuesday (Windows lang, not SQL Server's)
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'en-us'); -- Tuesday
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'ru-RU'); -- вторник
SELECT SQL#.Date_Format(@TestDate, 'dddd', 'fa-IR'); -- سه شنبه
SQL# Date_Format
函数与内置 FORMAT
函数本质上具有相同的签名,只是 SQLCLR 函数中不能省略第三个参数 (Culture) ,因此当不使用区域性时,需要将其设置为空字符串 ''
。另一个区别是 SQLCLR 似乎不知道当前 session LANGUAGE 设置,因此默认区域性是 Windows 设置的任何区域性(但在这种特殊情况下这不是问题)。
附注请参阅 MSDN 页面 Custom Date and Time Format Strings更多格式选项。
关于sql-server - 在 sql 函数中使用设置语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30997398/