Select 语句通过 SQL 服务器代理执行时产生不同的结果

Select Statement yields different result when executed via SQL Server Agent

我在 SQL Server 2014,标准版(64 位)上观察到一个我无法解释的奇怪行为:

一个简单的 select 语句在手动执行或通过 SQL 作业执行时表现不同:

sql-语句如下:

[USE DB2]
GO

Select * from DB1.dbo.price p 
where 
    p.sec_id = 10 and 
    p.dt = CONVERT(date,getdate() - (case when datename(dw,getdate()) = 'Monday' then 3 else 1 end))

该声明从 table dbo.price 中提取某证券 (sec_id = 10) 的前一个工作日的价格记录,通常是 1 天前,但是星期一是 3 天前,因为只有工作日的价格记录可用(每个工作日每个证券 1 个价格记录)。

此 sql 语句嵌入到存储过程中,该存储过程本身通过 SQL 服务器代理作业执行。

发生的奇怪事情是:

由于该工作在周二至周五工作,因此不应该有任何特权等问题。并且由于语句在手动执行时有效,因此语句本身也不应该有任何问题。

但是为什么在通过 SQL 作业执行时它在星期一不工作?

有人知道原因是什么吗?不幸的是我有 none ...

非常感谢您的帮助。 干杯

这是由于代理作业在其下运行的身份的默认语言。

在您的代理作业中将此添加到脚本中:

SET DATEFIRST 7

[或您希望被视为一周第一天的任何一天]

(它是特定于连接的,因此不会影响其他连接。)

或者您可以更改 SQL 代理(如果您使用的是代理,则为代理)使用的默认登录语言:

USE [master]
GO
ALTER LOGIN [LoginName] WITH DEFAULT_LANGUAGE = [SomeLanguage]
GO 

参考:SET DATEFIRST

作为 ,这可能是因为代理作业使用了不同的 language/date 设置。

我的首选修复方法不是 fiddle 设置,而是选择 "known good" 天并设置正确的 属性:

datename(dw,getdate()) = datename(dw,'20150720')

碰巧 2015 年 7 月 20 日(选择完全是任意的,我正好看到 2015 年的台历)是星期一,我使用明确的日期格式作为我的文字。因此,无论何时 datename(dw,getdate()) 碰巧 return 在星期一应该总是 datename(dw,'20150720') 产生。