我正在尝试在同一个查询中加载多个变量,如
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')
答案 0 :(得分: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
您的select为consturcted,一次只能获得一个变量值,因为每次为每条记录评估每个变量,因此 - MAX()
如果有超过1条记录回答了批评WFStep = ?
,那么你应该告诉我们你想要哪一条。
答案 1 :(得分:0)
它为从工作流程检索到的每一行设置所有变量。如果最后只设置了diWorkflowStatusId,那是因为你的最后一行有WFStep =' DI'。
答案 2 :(得分:0)
您的查询会返回多条记录,在这种情况下,变量会使用所选最后一条记录的值进行填充(因为您不会给出order by
条款,因为它不可预测哪条记录是显然,它是WFStep='DI'
)的记录。