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 语句 "manually",即通过查询编辑器,它会产生正确的结果,即在周一至周五执行时 return 编辑了一条价格记录.
- 上述sql语句通过存储过程"manually"执行时也是如此
- 但是,当包含上述语句的存储过程通过SQL服务器代理作业执行时,该语句仅return是周二至周五的价格记录。在星期一,声明 return 没有记录。 (即使存储过程分别sql语句return一条记录时手动执行)。
由于该工作在周二至周五工作,因此不应该有任何特权等问题。并且由于语句在手动执行时有效,因此语句本身也不应该有任何问题。
但是为什么在通过 SQL 作业执行时它在星期一不工作?
有人知道原因是什么吗?不幸的是我有 none ...
非常感谢您的帮助。
干杯
这是由于代理作业在其下运行的身份的默认语言。
在您的代理作业中将此添加到脚本中:
SET DATEFIRST 7
[或您希望被视为一周第一天的任何一天]
(它是特定于连接的,因此不会影响其他连接。)
或者您可以更改 SQL 代理(如果您使用的是代理,则为代理)使用的默认登录语言:
USE [master]
GO
ALTER LOGIN [LoginName] WITH DEFAULT_LANGUAGE = [SomeLanguage]
GO
作为 ,这可能是因为代理作业使用了不同的 language/date 设置。
我的首选修复方法不是 fiddle 设置,而是选择 "known good" 天并设置正确的 属性:
datename(dw,getdate()) = datename(dw,'20150720')
碰巧 2015 年 7 月 20 日(选择完全是任意的,我正好看到 2015 年的台历)是星期一,我使用明确的日期格式作为我的文字。因此,无论何时 datename(dw,getdate())
碰巧 return 在星期一应该总是 datename(dw,'20150720')
产生。
我在 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 语句 "manually",即通过查询编辑器,它会产生正确的结果,即在周一至周五执行时 return 编辑了一条价格记录.
- 上述sql语句通过存储过程"manually"执行时也是如此
- 但是,当包含上述语句的存储过程通过SQL服务器代理作业执行时,该语句仅return是周二至周五的价格记录。在星期一,声明 return 没有记录。 (即使存储过程分别sql语句return一条记录时手动执行)。
由于该工作在周二至周五工作,因此不应该有任何特权等问题。并且由于语句在手动执行时有效,因此语句本身也不应该有任何问题。
但是为什么在通过 SQL 作业执行时它在星期一不工作?
有人知道原因是什么吗?不幸的是我有 none ...
非常感谢您的帮助。 干杯
这是由于代理作业在其下运行的身份的默认语言。
在您的代理作业中将此添加到脚本中:
SET DATEFIRST 7
[或您希望被视为一周第一天的任何一天]
(它是特定于连接的,因此不会影响其他连接。)
或者您可以更改 SQL 代理(如果您使用的是代理,则为代理)使用的默认登录语言:
USE [master]
GO
ALTER LOGIN [LoginName] WITH DEFAULT_LANGUAGE = [SomeLanguage]
GO
作为
我的首选修复方法不是 fiddle 设置,而是选择 "known good" 天并设置正确的 属性:
datename(dw,getdate()) = datename(dw,'20150720')
碰巧 2015 年 7 月 20 日(选择完全是任意的,我正好看到 2015 年的台历)是星期一,我使用明确的日期格式作为我的文字。因此,无论何时 datename(dw,getdate())
碰巧 return 在星期一应该总是 datename(dw,'20150720')
产生。