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

Вы должны использовать функцию агрегации:

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

Если есть более 1 записи, которые отвечают критериям WFStep = ? , тогда вы должны сообщить нам, какой из них вы хотите.

Он устанавливает все ваши переменные для каждой строки, полученной из рабочего процесса. Если в конце установлен только diWorkflowStatusId, это потому, что в вашей последней строке есть WFStep = 'DI'.

Ваш запрос возвращает несколько записей, и в этом случае переменные заполняются значениями последней выбранной записи (так как вы не даете предложение order by , это непредсказуемо, какая запись. По-видимому, это запись, где WFStep='DI' ).

Давайте будем гением компьютера.