SQL – Belegung mehrerer variables in derselben Abfrage

Ich versuche, mehrere variables in der gleichen Abfrage wie folgt zu laden

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 

Aber nur die zweite Variable @diWorkFlowStatusId wird bevölkert und nicht alle.

Was ist los?

Wenn ich es so mache, wird die ganze Variable richtig geladen, aber ich denke, das ist nicht der richtige path

 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') 

Sie müssen eine Aggregationsfunktion verwenden:

 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 

Ihre Auswahl als konstruiert, kann nur einen einzigen variableswert zu einem timepunkt erhalten, da jede dieser variables jedes Mal für jeden datasatz ausgewertet wird, also – die MAX()

Wenn es mehr als 1 datasatz gibt, der das Kriterium WFStep = ? , dann solltest du uns sagen, welche von ihnen du willst.

Es setzt alle variables für jede aus dem Workflow abgerufene Zeile. Wenn nur diWorkflowStatusId am Ende gesetzt ist, liegt es daran, dass deine letzte Zeile WFStep = 'DI' hat.

Ihre Abfrage gibt mehrere datasätze zurück, in welchen Fällen die variables mit den Werten des zuletzt aufgenommenen datasatzes gefüllt werden (da Sie keine order by Klausel WFStep='DI' , ist es unvorhersehbar, welcher datasatz das ist. Anscheinend ist der datasatz, wo WFStep='DI' ).