2016-11-10 4 views
0

サブクエリを代わりに使用するように、INステートメント(結合条件にある)内の静的なvarcharsのリストを切り替えることによって実行するプロシージャを更新しようとしています。 。しかし、私はエラーが表示されますConversion failed when converting the varchar value 'Normal' to data type int.結合の制約をvarcharsのリストからサブクエリに変更するときに変換が失敗する

私はそれが知っていることを知っている私は 'ノーマル'値をintに変換しようとしていますが、このクエリでは何もない場所がありませんint - それはすべてvarcharまたはdatetimeで、サブクエリは以前のvarcharsの静的リストと同じ値を返します。さらに、私のデータセットのどこにも "Normal"という値を持つ場所はありません。これは本当に私を混乱させるものです。

これまでに他の誰かがこのようなことをしたことがありますか?

EDIT:
はここで(単にエラーの原因となっている部分を表示するために縮小)コードです:

select * from #tempTable 
    left join dbo.v_Lookup_Assumptions Assumptions on 
    case when Group3 in 
    --('Value1', 'Value2', 'Value3') 
    (Select lookupdetail_name from lookupDetail) 
    then Group3 else Group2 end =Assumptions.Sector2 
    and AsOfDate between Assumptions.StartDate and Assumptions.EndDate 
    and ShortName = Assumptions.AssumptionShortName 

私はサブクエリをコメントアウトし、値のリストのコメントを解除し、それが動作することができます。また、サブクエリを使用しているときに "ShortName"制約を実行しないと、期待通りの結果が得られません。すべての結合制約は、varcharまたはdateのいずれかです。

さらに、静的な値のリストに「標準」を追加し、期待どおりに実行しました。サブクエリをSELECT 'Value1' from lookupDetailに更新しましたが、失敗しました。

EDIT2:
そして、これは意味がありませんが、私は、元#tempTable 2080に記録、新しい副問合せの構文の作品を制限している場合。しかし、もし私が2081レコードに行かせると、それはデータセットに関係なく失敗します。言い換えれば、日付を変更して毎回異なるデータを取得し、#tempTableを2080レコードに制限するので、この新しい構文はうまくいきます。それを2081レコードに変更すると失敗します。 WHERE句で2081レコードのデータセットとフィルタを実行すると、2081レコードのすべての行が同時に2081すべてでない限り、表示されます。

+3

"before"と "after"のコードを実際に読むのがちょっと助けることができる時代の一つだと思います – Lamak

+1

私はこれまでと同じようなものに遭遇したと思います。 @lamakは助けになるコードを見る必要があります。 –

+0

ノーマルはどこかに潜んでいなければなりません... – scsimon

答えて

0

レコードの総数が2080を超え、暗黙的にvarcharフィールドをintに変換すると、実行計画が変更されていることが判明しました。 SQL Server Profilerから小さなデータセットのXMLクエリプランを取得し、大きなデータセットクエリにOPTION (USE PLAN '<Insert XML Query Plan Here />')を使用するように強制しました。

関連する問題