通过SQL Server代理执行Select语句会产生不同的结果

时间:2018-12-10 09:33:27

标签: sql sql-server sql-server-2014

我在我们的SQL Server 2014 Standard Edition(64位)上观察到一种奇怪的行为,我无法解释:

简单的select语句在手动执行或通过SQL Job执行时的行为有所不同:

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))

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

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

奇怪的是:

  • 如果上述sql语句“手动”执行(即通过查询编辑器执行),则会产生正确的结果,即星期一至星期五执行时返回一条价格记录。
  • 当上述sql语句通过存储过程“手动”执行时,情况同样如此。
  • 但是,当通过SQL Server代理作业执行包含上述语句的存储过程时,该语句仅返回星期二至星期五的价格记录。在星期一,该语句不返回任何记录。 (即使存储过程和sql语句分别在手动执行时都返回一条记录)。

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

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

有人会知道原因可能是什么吗?不幸的是我没有...

非常感谢您的帮助。 干杯

2 个答案:

答案 0 :(得分:2)

这是由于代理作业运行所使用的身份的默认语言。

在您的代理工作中,将其添加到脚本中:

 android:clickable="true"
 android:focusable="true"

[或您希望将其视为一周的第一天]

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

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

SET DATEFIRST 7

参考:SET DATEFIRST

答案 1 :(得分:2)

Mitch says一样,很可能是由于代理作业使用的语言/日期设置不同。

我首选的解决方法不是摆弄设置,而是选择具有正确属性的“已知好”日子:

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

碰巧,2015年7月20日(选择完全是任意的,我只是碰巧有一个2015年的台历)在星期一,而我使用的是明确的日期格式。因此,无论何时 datename(dw,getdate())星期一都应该返回datename(dw,'20150720')产生的东西。