sql-server - 在 sql 函数中使用设置语言

标签 sql-server t-sql sql-server-2008 user-defined-functions date-formatting

我想在函数中使用 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/

相关文章:

sql - 长 SQL 文件运行 SQL Server 内存不足(22,000 行)

sql-server - 如何找出SQL Server 2008试用版安装实例的有效期限?

sql-server - 使用 SQL : How to extract a record within a JSON object? 解析 JSON

c# - 带有数据透视表的 CTE

sql-server - 转换 hh :mm to minutes in SQL Server

sql-server - 如何安全地将 NVARCHAR 转换为 MONEY

sql - GROUP BY 一列;为另一个选择任意值

t-sql - 在子查询中使用 MAX() 时为 "SQL Server Subquery returned more than 1 value"

sql-server - decimal 和 bigint 除法时如何定义小数位数?

sql-server - 为什么当我尝试创建存储过程时出现错误?