2012-03-15 2 views
1

Это было очень озадачительно, надеюсь, кто-то может просветить меня. У меня есть сохраненный proc, который возвращает ожидаемые (по крайней мере мне) результаты, когда я запускаю его из SSMS, и он возвращает неожиданные результаты, когда я запускаю его из SQL Job. Сервер работает под управлением SQL Server 2005, не уверен в версии sp. Я могу получить это, если это поможет.Непоследовательные результаты SQL Server 2005 между SSMS и SQL-заданием

Когда я запускаю код из SSMS, только одна запись, Mon, Mar 05 :, содержит «True» для InsufficientSampleSize, как я ожидаю.

Когда я запускаю тот же код из SQL-задания, все записи содержат «True» для InsufficientSampleSize, что является неожиданным.

Есть ли что-то не так, как я оцениваю значение d.ScoreCount? Может быть, это параметр db, такой как ANSI_NULLS, который отличается от того, когда я запускаю процедуру с помощью Job? В настоящее время мои данные не содержат нулей, поэтому я не думаю, что это ANSI_NULLS.

Заранее спасибо. Я попытался переписать эту логику несколько раз, и я все еще сталкиваюсь с этой проблемой.

create table #tmpScoreData (EventDate datetime, Score int) 

insert into #tmpScoreData values('20120302', 4) 
insert into #tmpScoreData values('20120302', 7) 
insert into #tmpScoreData values('20120302', 7) 
insert into #tmpScoreData values('20120302', 2) 
insert into #tmpScoreData values('20120302', 7) 

insert into #tmpScoreData values('20120303', 9) 
insert into #tmpScoreData values('20120303', 2) 
insert into #tmpScoreData values('20120303', 4) 
insert into #tmpScoreData values('20120303', 2) 
insert into #tmpScoreData values('20120303', 5) 

insert into #tmpScoreData values('20120304', 8) 
insert into #tmpScoreData values('20120304', 8) 
insert into #tmpScoreData values('20120304', 7) 
insert into #tmpScoreData values('20120304', 2) 
insert into #tmpScoreData values('20120304', 5) 

insert into #tmpScoreData values('20120305', 7) 
insert into #tmpScoreData values('20120305', 6) 
insert into #tmpScoreData values('20120305', 2) 

insert into #tmpScoreData values('20120306', 7) 
insert into #tmpScoreData values('20120306', 2) 
insert into #tmpScoreData values('20120306', 4) 
insert into #tmpScoreData values('20120306', 2) 
insert into #tmpScoreData values('20120306', 5) 

insert into #tmpScoreData values('20120307', 5) 
insert into #tmpScoreData values('20120307', 2) 
insert into #tmpScoreData values('20120307', 8) 
insert into #tmpScoreData values('20120307', 7) 
insert into #tmpScoreData values('20120307', 5) 

insert into #tmpScoreData values('20120308', 9) 
insert into #tmpScoreData values('20120308', 4) 
insert into #tmpScoreData values('20120308', 8) 
insert into #tmpScoreData values('20120308', 3) 
insert into #tmpScoreData values('20120308', 5) 

declare @weekEnding datetime 
set @weekEnding = '20120308' 

select EventDate = cd.WeekDayAbbr + ', ' + substring(convert(varchar(10), cd.CalendarDate, 107), 1, 6) + ':', 
    AvgScore = d.Score, 
    InsufficientSampleSize = case when isnull(d.ScoreCount, 0) < 5 then 'True' end, 
    WeekEnding = @weekEnding 
from (select 1 as ID, 'Fri' as WeekDayAbbr, @weekEnding - 6 as CalendarDate 
    union 
    select 2, 'Sat', @weekEnding - 5 
    union 
    select 3, 'Sun', @weekEnding - 4 
    union 
    select 4, 'Mon', @weekEnding - 3 
    union 
    select 5, 'Tue', @weekEnding - 2 
    union 
    select 6, 'Wed', @weekEnding - 1 
    union 
    select 7, 'Thu', @weekEnding) as cd 
left join (select EventDate, 
       avg(convert(decimal(9,4), Score)) as Score, 
       count(Score) as ScoreCount 
      from #tmpScoreData 
      where EventDate <= @weekEnding 
      and EventDate > @weekEnding - 7 
      group by EventDate) as d on cd.CalendarDate = d.EventDate 
order by cd.ID 

drop table #tmpScoreData 

Я обновил даты до менее двусмысленных значений. В моем фактическом сохраненном proc даты находятся в таблице exiting как значения datetime. Таким образом, это не является причиной моей проблемы. Благодарю.

ответ

2

Возможно, что ваши даты интерпретируются по-разному. '3/8/2012' означает 3 августа или 8 марта?

Чтобы избежать двусмысленности, не просто используйте строки и неявные преобразования. Вместо того, чтобы использовать строки и явных преобразования ...

CONVERT(DATETIME, '3/8/2012', 103) -- Or whichever format is relevant 

См CAST and CONVERT (Transact-SQL) для форматов вам нужно.

+0

Или еще лучше строки, которые не могут быть неверно истолкованы кем-либо, например. ''20120308'' ... –

+0

@AaronBertrand - Я думал, что это универсально, если он также включает часть времени? И хотя он не может быть неправильно интерпретирован механизмом базы данных, многие люди все равно будут неправильно интерпретировать даты, если у них нет подсказки для проверки формата. – MatBailie

+0

Нет, не правда. Даже '' yyyy-mm-dd'' не является универсальным без '' Thh: mm ... ''. '' yyyymmdd' - единственный формат только для даты, который, как я знаю, универсален и не может быть неверно истолкован на основе языка, даты или региональных настроек. –

Смежные вопросы