2016-06-15 4 views
4

に複数の変数を移植私はこのSQL - 同じクエリ

declare @currentUserPersonnelNumber int 
declare @draftWorkFlowStatusId int 
declare @diWorkFlowStatusId int 
declare @ibWorkFlowStatusId int 
declare @ipWorkFlowStatusId int 

select 
    @draftWorkFlowStatusId = case when WFStep='DR' then WorkFlowId else NULL end, 
    @diWorkFlowStatusId = case when WFStep='DI' then WorkFlowId else NULL end, 
    @ibWorkFlowStatusId = case when WFStep='IB' then WorkFlowId else NULL end, 
    @ipWorkFlowStatusId = case when WFStep='IP' then WorkFlowId else NULL end 
from WorkFlow 

のように同じクエリで複数の変数をロードしようとしていますしかし、唯一の第二の可変@diWorkFlowStatusIdはすべて人口取得していません。

私は何をしていますか?私はこのようにそれを行うと

すべての変数が正しくロードされますが、私はそれはそれは、ワークフローから取得した行ごとにすべての変数を設定しています正しい方法

declare @draftWorkFlowStatusId int = (SELECT WorkFlowId FROM [WorkFlow] WHERE WFStep = 'DR') 
declare @diWorkFlowStatusId int = (SELECT WorkFlowId FROM [WorkFlow] WHERE WFStep = 'DI') 
declare @ibWorkFlowStatusId int = (SELECT WorkFlowId FROM WorkFlow WHERE WFStep = 'IB') 
declare @ipWorkFlowStatusId int = (SELECT WorkFlowId FROM WorkFlow WHERE WFStep = 'IP') 
+1

変数の出力が最後のもので上書きされることを除いて、クエリケースの問合せで問題はありません。 – TheGameiswar

答えて

3

あなたは集計関数を使用する必要があります。

declare @currentUserPersonnelNumber int 
declare @draftWorkFlowStatusId int 
declare @diWorkFlowStatusId int 
declare @ibWorkFlowStatusId int 
declare @ipWorkFlowStatusId int 

select 
    @draftWorkFlowStatusId = MAX(case when WFStep='DR' then WorkFlowId end), 
    @diWorkFlowStatusId = MAX(case when WFStep='DI' then WorkFlowId end), 
    @ibWorkFlowStatusId = MAX(case when WFStep='IB' then WorkFlowId end), 
    @ipWorkFlowStatusId = MAX(case when WFStep='IP' then WorkFlowId end) 
from WorkFlow 

あなたconsturcted選択として、この変数のそれぞれは、したがって、各レコードのたびに評価されているので、一度に単一の変数の値を取得することができます - MAX()

批評文WFStep = ?に答えるレコードが1つ以上ある場合は、どちらを希望しているのかを教えてください。

+0

優秀!!ありがとう!唯一のことは、警告:「集計または他のSET操作によってヌル値が削除されました」というメッセージでこの警告を出していることです。 –

+1

@PawanNogariyaこれは問題ありません。また、デフォルトの 'ELSE'から' ELSE NULL'を使う必要はないことに注意してください。 – sagi

+0

もう1つ、これは変数をロードする効率的な方法ですか、それとも他に何か良いことを示唆していますか? –

0

ではないと思います。 diWorkflowStatusIdだけが最後に設定されている場合は、最後の行にWFStep = 'DI'が設定されているためです。

0

あなたのクエリは複数のレコードを返します。その場合、変数には最後に選択したレコードの値が入力されます(order by句を指定しないため、予測できません) 。

関連する問題