Оператор Select дает другой результат при выполнении через агент SQL Server - PullRequest
0 голосов
/ 10 декабря 2018

Я наблюдаю странное поведение на нашем SQL Server 2014 Standard Edition (64-разрядная версия), которое не могу объяснить:

Простой оператор выбора ведет себя по-разному при выполнении вручную или с помощью задания 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))

Оператор извлекает ценовую запись из таблицы dbo.price для определенной ценной бумаги (sec_id = 10) для предыдущего рабочего дня, которая обычноЗа 1 день до этого, однако по понедельникам, это за 3 дня, так как доступны только записи о ценах в рабочие дни (1 запись о цене за ценную бумагу в течение рабочего дня).

Этот SQL-оператор встроен в хранимую процедуру, котораясам выполняется через задание агента SQL Server.

Странная вещь происходит:

  • Если приведенный выше оператор SQL выполняется «вручную», то есть с помощью редактора запросов, он выдаетправильный результат, то есть одна ценовая запись возвращается при выполнении с понедельника по пятницу.
  • То же самое верно, когда приведенный выше оператор SQL выполняетсяредактируется «вручную» с помощью хранимой процедуры.
  • Однако, когда хранимая процедура, содержащая вышеприведенный оператор, выполняется через задание агента SQL Server, оператор возвращает ценовую запись только со вторника по пятницу.По понедельникам заявление не возвращает никаких записей.(Несмотря на то, что хранимая процедура и оператор sql возвращают запись при выполнении вручную).

Поскольку задание работает со вторника по пятницу, не должно быть никаких проблем с привилегиями и т. Д.работает, когда выполняется вручную, не должно быть никаких проблем с оператором как таковым.

Но почему он не будет работать в понедельник при выполнении с помощью задания SQL?

Кто-нибудьесть идея, в чем причина?У меня их нет, к сожалению ...

Большое спасибо за любую помощь.Приветствия

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Как и Митч говорит , это, вероятно, из-за различных настроек языка / даты, используемых заданием агента.

Хотя я предпочитаю не исправлять настройки, а вместо этоговыберите «известный хороший» день с правильным свойством:

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

Случилось так, что 20 июля 2015 года (выбор был совершенно произвольным, у меня просто случайно появился настольный календарь на 2015 год) был понедельник иЯ использую однозначный формат даты в качестве моего литерала.Таким образом, когда-либо datename(dw,getdate()) случается, что возвращение по понедельникам всегда должно быть тем, что datename(dw,'20150720') производит.

0 голосов
/ 10 декабря 2018

Это связано с языком идентификации по умолчанию, под которым выполняется задание агента.

В вашей агентской работе добавьте это в скрипт:

SET DATEFIRST 7

[или любой другой день недели, который вы ожидаете считать первым днем ​​недели]

(это соединениеспецифичные, поэтому не будут влиять на другие соединения.)

Или вы можете изменить язык по умолчанию для имени входа, используемого агентом SQL (или прокси-сервером, если вы его используете):

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

Ссылка: SET DATEFIRST

...