2015-07-17 4 views
-1

Когда я запускаю этот запрос, я получаю эту ошибку:Ошибка при excuting ВЫБЕРИТЕ СЛУЧАЙ

Procedure sp_GET_RANDOM_QUESTIONS, Line 40 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. Msg 116, Level 16, State 1, Procedure sp_GET_RANDOM_QUESTIONS, Line 52 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

Это хранимая процедура, которая предназначена, чтобы дать случайные вопросы, в @easy, @medium, @hard являетесь количество вопросов, которые будут рандомизированы. Если пользователь хочет просто дать @num, я разделим это число на 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 
+2

СЛУЧАЙ не для контроля, из-потока (он должен возвращать одно значение); если вы хотите, чтобы один или другой набор результатов использовал IF/ELSE –

+1

Ваш код - беспорядок, если не сказать больше. Проблема здесь заключается в том, что вы пытаетесь использовать выражение case для управления потоком, который не работает. Здесь вам нужно использовать логику IF/ELSE. Также вы должны избегать префикса sp_. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

ответ

1

Как сказано в комментариях заявили, что вам нужно использовать 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