2016-06-15 5 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

Я не вижу проблемы с запросом на запрос запроса, за исключением того, что переменная output будет переопределена последней. – 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()

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

+0

Отлично !! Благодаря! Единственное, что он дает это предупреждение в сообщении «Предупреждение: значение Null исключается агрегированием или другой операцией SET». –

+1

@PawanNogariya Это нормально, я не уверен, почему это предупреждение происходит, но не проблема с этим запросом , также обратите внимание, что вам не нужно использовать 'ELSE NULL', так как по умолчанию используется' ELSE'. – sagi

+0

Получил! Еще одна вещь, это эффективный способ загрузки переменных или вы предлагаете что-то еще лучше? –

0

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

0

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

Смежные вопросы