2012-03-15 13 views
1

これは非常に困惑しています。うまくいけば誰かが私を啓発することができます。 SSMSから実行したときに期待通りの結果を返すストアドプロシージャがあり、SQLジョブから実行すると予期しない結果が返されます。サーバーはSQL Server 2005を実行していますが、spバージョンについてはわかりません。私が助けてくれればこれを得ることができます。SQL Server 2005 SSMSとSQLジョブの照合結果が一貫していません

SSMSから以下のコードを実行すると、Mon、Mar 05:、というレコードがInsufficientSampleSizeに 'True'を含むと予想されます。

SQLジョブから同じコードを実行すると、予期せぬInsufficientSampleSizeに対してすべてのレコードに 'True'が含まれます。

d.ScoreCountの値をどのように評価していますか?多分ANSI_NULLSのようなdb設定ですが、これはJobを使ってプロシージャを実行すると違うのでしょうか?私のデータには現時点ではnullが含まれていないので、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 

日付をあまりあいまいな値に更新しました。私の実際のストアドプロシージャでは、日付はdatetime値としてexisingテーブルにあります。だから、これは私の問題の原因ではありません。ありがとう。

答えて

2

日付の解釈が異なる可能性があります。 '3/8/2012'は8月3日か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''は私が知っている唯一の日付のみのフォーマットであり、普遍的であり、言語、日付フォーマット、または地域の設定に基づいて誤解されることはありません。 –

関連する問題