Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql函数中使用集合语言_Sql Server_Tsql_Sql Server 2008_User Defined Functions_Date Formatting - Fatal编程技术网

Sql server 在sql函数中使用集合语言

Sql server 在sql函数中使用集合语言,sql-server,tsql,sql-server-2008,user-defined-functions,date-formatting,Sql Server,Tsql,Sql Server 2008,User Defined Functions,Date Formatting,我想在函数中使用DATENAME,但问题是DATENAME的结果取决于登录或安装语言设置 为了确保它始终返回英文结果,我需要使用设置语言“english”,但如果我在函数中使用它,我将得到以下错误 在函数中无效使用副作用运算符“SET COMMAND” 你能试试这个吗 选择 案例日期部分(dw,getdate()) 当isnull(nullif((7-@@datefirst+1)%7,0)时,7)然后是“星期日” 当isnull(nullif((7-@@datefirst+2)%7,0)时,7)

我想在函数中使用
DATENAME
,但问题是DATENAME的结果取决于登录或安装语言设置

为了确保它始终返回英文结果,我需要使用
设置语言“english”
,但如果我在函数中使用它,我将得到以下错误

在函数中无效使用副作用运算符“SET COMMAND”

你能试试这个吗

选择
案例日期部分(dw,getdate())
当isnull(nullif((7-@@datefirst+1)%7,0)时,7)然后是“星期日”
当isnull(nullif((7-@@datefirst+2)%7,0)时,7)然后是“星期一”
当isnull(nullif((7-@@datefirst+3)%7,0)时,7)然后是“星期二”
当isnull(nullif((7-@@datefirst+4)%7,0)时,7)然后是“星期三”
当isnull(nullif((7-@@datefirst+5)%7,0)时,7)然后是“星期四”
当isnull(nullif((7-@@datefirst+6)%7,0)时,7)然后是“Friday”
当isnull(nullif((7-@@datefirst+7)%7,0)时,7)然后是“星期六”
结束;

对于任何使用SQL Server 2012或更新版本的用户,通过
FORMAT
功能可以很容易地做到这一点,如下所示:

设置语言为“英语”;
声明@TestDate-DATETIME;
设置@TestDate='2015-06-23';
选择格式(@TestDate,'dddddd');--星期二
选择格式(@TestDate,'dddddd','en-us');--星期二
选择格式(@TestDate,'dddddd','ru-ru');--вторник
选择格式(@TestDate,'dddddd','fa-IR');--سه شنبه
设置语言为“法语”;
选择格式(@TestDate,'dddddd');--马尔迪
选择格式(@TestDate,'dddddd','en-us');--星期二
选择格式(@TestDate,'dddddd','ru-ru');--вторник
选择格式(@TestDate,'dddddd','fa-IR');--سه شنبه
但是,那些仍然使用SQLServer2005、2008或2008R2的人呢?当然,使用SQLCLR也可以做到这一点。事实上,SQL Server 2012中引入的
FORMAT
函数(即上图所示的函数)正在后台使用SQLCLR。因此,您可以编写一个简单的CLR UDF来实现这一点,也可以简单地下载该库(我是该库的作者,但该函数在免费版本中提供),并使用
Date\u Format
函数,如下所示:

设置语言为“英语”;
声明@TestDate-DATETIME;
设置@TestDate='2015-06-23';
选择SQL#.Date_格式(@TestDate,'dddddd','');--星期二
选择SQL#.Date_格式(@TestDate,'dddddd','en-us');--星期二
选择SQL#.Date_格式(@TestDate,'dddddd','ru-ru');--вторник
选择SQL#.Date_格式(@TestDate,'dddddd','fa IR');--سه شنبه
设置语言为“法语”;
选择SQL#.Date_格式(@TestDate,'dddddd','');--星期二(Windows lang,而不是SQL Server)
选择SQL#.Date_格式(@TestDate,'dddddd','en-us');--星期二
选择SQL#.Date_格式(@TestDate,'dddddd','ru-ru');--вторник
选择SQL#.Date_格式(@TestDate,'dddddd','fa IR');--سه شنبه
SQL#
Date\u Format
函数的签名与内置的
Format
函数基本相同,只是SQLCLR函数中不能忽略第三个参数(区域性),因此在不使用区域性时,需要将其设置为空字符串
'
。另一个不同之处是SQLCLR似乎不知道当前会话
语言
设置,因此默认区域性是Windows设置为什么(但在这种特殊情况下,这不是问题)


另外,有关更多格式选项,请参见MSDN页面。

您不能。现在还不清楚您想要实现什么,但是我可以看到使用
DATENAME
的主要原因是提供一些日期格式,这是表示层的工作,而不是SQL。如果我错了,并且确实需要知道英文日期名称,那么最好的选择是创建一个,并为每个日期添加带有英文日期名称的列,然后在函数中使用它。这与OP已经尝试解决的问题完全相同:基于语言的设置。
@@DATEFIRST
值是基于当前语言的,因此会随着
设置语言
值的不同而改变,就像
DATENAME
输出一样。请参阅MSDN页面以获取示例。在评论任何内容之前,请先尝试,然后再评论。完整地阅读代码,然后写下您的评论。我已经测试过,但不是整个查询,包括
DATEPART()
函数,我忘记了它对
@@DATEFIRST
的值也很敏感。所以,是的,这似乎是可行的。对不起,我的测试不够全面。我试图删除否决票,但它给了我一个错误,说它被锁定,除非答案被编辑。因此,如果您进行小编辑,我应该能够删除下一票。由于某些原因,您的编辑没有注册,因此我进行了小的代码格式更改,然后能够将下一票更改为上一票。此选项仅支持SQL 2012及以上版本,但此问题在SQL 2008下发布。@AnandaKumarJayaraman是,问题是关于SQLServer2008的,我专门讨论了它,甚至给出了一个在SQLServer2005、2008和2008R2中工作的示例。为了完整起见,我添加了有关
格式
函数的信息。