SQL - 在同一查询中填充多个变量

时间:2016-06-15 09:38:23

标签: sql sql-server

我正在尝试在同一个查询中加载多个变量,如

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

3 个答案:

答案 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')的记录。