首页 文章

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

提问于
浏览
1

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

手动执行或通过SQL作业执行时,简单的select语句的行为会有所不同:

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语句"manually",即通过查询编辑器,它会产生正确的结果,即在星期一到星期五执行时返回一个价格记录 .

  • 当通过存储过程执行上述sql语句"manually"时也是如此 .

  • 但是,当通过SQL Server代理作业执行包含上述语句的存储过程时,该语句仅在星期二到星期五返回价格记录 . 在星期一,该声明不返回任何记录 . (即使存储过程分别是sql语句在手动执行时返回记录) .

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

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

有人会知道原因是什么吗?遗憾的是我没有...

非常感谢您的帮助 . 干杯

2 回答

  • 1

    作为Mitch says,可能是因为代理作业使用了不同的语言/日期设置 .

    我的首选修复方法不是设置,而是选择具有正确属性的“已知良好”日:

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

    碰巧的是,2015年7月20日(选择完全是随意的,我恰好有一个视力的2015年台历)是星期一,我使用明确的日期格式作为我的文字 . 因此,如果 datename(dw,getdate()) 恰好在周一返回,那么应始终是 datename(dw,'20150720') 产生的 .

  • 2

    这是由于Agent作业在其下运行的标识的默认语言 .

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

    SET DATEFIRST 7
    

    [或者你希望被视为一周中第一天的任何一天]

    (它是特定于连接的,所以不会影响其他连接 . )

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

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

    参考:SET DATEFIRST

相关问题