Sql server 执行选择案例时出错

Sql server 执行选择案例时出错,sql-server,Sql Server,运行此查询时,出现以下错误: 程序sp_获取随机问题,第40行 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式。 Msg 116,16级,状态1,程序sp_获取随机问题,第52行 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式 这是一个存储过程,旨在给出随机问题,@easy、@medium、@hard是将被随机分配的问题数。 如果用户选择只给出一个@num,我将把这个数字除以3(3个困难),然后得到这些随机问题 SELECT case WHEN @num=0 THE

运行此查询时,出现以下错误:

程序sp_获取随机问题,第40行 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式。 Msg 116,16级,状态1,程序sp_获取随机问题,第52行 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式

这是一个存储过程,旨在给出随机问题,@easy、@medium、@hard是将被随机分配的问题数。 如果用户选择只给出一个@num,我将把这个数字除以3(3个困难),然后得到这些随机问题

SELECT  case
WHEN @num=0 THEN (
    SELECT * FROM (
    SELECT top (@easy) * from TBL_PERGUNTAS as p where p.category=1 order by NEWID()) as a
    UNION ALL SELECT * FROM
    (SELECT top (@medium) * from TBL_PERGUNTAS as p where p.category=2 order by NEWID()) as b
    UNION ALL SELECT * FROM
    (SELECT top (@hard) * from TBL_PERGUNTAS as p where p.category=3 order by NEWID()) as c)
    else (
    SELECT * FROM
    (SELECT top (@num/3) * from TBL_PERGUNTAS as p where p.category=1 order by NEWID()) as a
    UNION ALL SELECT * FROM
    (SELECT top (@num/3) * from TBL_PERGUNTAS as p where p.category=2 order by NEWID()) as b
    UNION ALL SELECT * FROM
    (SELECT top (@num/3) * from TBL_PERGUNTAS as p where p.category=3 order by NEWID()) as c )
END

正如注释所述,您需要使用
IF/ELSE
来控制流量,请尝试以下方法:

IF @num=0 THEN 
BEGIN
    SELECT top (@easy) * 
    FROM TBL_PERGUNTAS as p 
    WHERE p.category=1 
    ORDER BY NEWID()

    UNION ALL 

    SELECT top (@medium) * 
    FROM TBL_PERGUNTAS as p 
    WHERE p.category=2 
    ORDER BY NEWID()

    UNION ALL 

    SELECT top (@hard) * 
    FROM TBL_PERGUNTAS as p 
    WHERE p.category=3 
    ORDER BY NEWID())
END
ELSE
BEGIN
    SELECT top (@num/3) * 
    FROM TBL_PERGUNTAS as p 
    WHERE p.category=1 
    ORDER BY NEWID()

    UNION ALL 

    SELECT top (@num/3) * 
    FROM TBL_PERGUNTAS as p
    WHERE p.category=2 
    ORDER BY NEWID()

    UNION ALL  

    SELECT top (@num/3) * 
    FROM TBL_PERGUNTAS as p 
    WHERE p.category=3 
    ORDER BY NEWID())
END

案例不用于控制流量(必须返回单个值);如果您想要一组或另一组结果,请使用if/elsey您的代码至少可以说是一团糟。这里的问题是,您试图使用一个case表达式来控制不起作用的流。这里需要使用IF/ELSE逻辑。此外,还应避免使用sp_uu前缀。