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