2015-08-26 2 views
0

меня возвращают следующие SPДело в том, где класс - хранимая процедура

ALTER PROCEDURE [dbo].[GetStudentsByUserId] 
    @userId UNIQUEIDENTIFIER, 
    @roleType bit 
AS 
SET NOCOUNT ON; 
    DECLARE @classId UNIQUEIDENTIFIER 

    EXEC [dbo].[GetClassId] @userId,@classId OUTPUT 

    SELECT 
     B.StudentId, 
     B.StudentName, 
     B.Description, 
     B.StudentType 
    FROM 
     ClassStudents A 
    INNER JOIN 
     Student B 
    ON 
     B.StudentId = A.StudentId 
    WHERE 
     A.CassId = @classId 
    AND 
    ( 
     B.StudentType = 
     CASE 
      @roleType 
      when 1 
      then 1 
      when 2 
      then 2 
     END 
    OR 
     B.StudentType = 
     CASE 
      @roleType 
      when 1 
      then 4 
      when 2 
      then 2 
     END 
    ) 

Когда я запускаю это следующим образом

exec [GetStudentsByUserId] '28f95465-f30f-4b8b-cc92-d4c4e8d73273', 1 

возвращает студентов с типом студента 1. И когда я бегу это следующим образом:

exec [GetStudentsByUserId] '28f95465-f30f-4b8b-cc92-d4c4e8d73273', 2 

Также он возвращает студентов со студентом типа 1. Бу т мне нужно студенты с типом 2.

Я просто хочу, чтобы студенты с 1-го типа, 4, когда я прохожу roleType как 1, и хочу получить студент 2-го типа, когда я прохожу roleType, как 2.

Любые лучшие решения очень заметны.

+0

Почему и теги MySQL и SQL Server? (Вы действительно используете оба продукта здесь?) – jarlh

+0

Просто MySQL. Я его отредактировал. – Gunaseelan

+0

Ну, часть [dbo]. [GetClassId] больше похожа на sql-сервер – jkavalik

ответ

2

Ваш входной параметр @roleType is bit Тип данных.
Согласно MSDN:

типа данных целого числа, которое может принимать значение 1, 0 или NULL.

Но проверить его на значение 2, что всегда будет равна 1

0

Передача 2 биту типа не представляется возможным. Вам нужно изменить предложение where, как показано ниже.

ALTER PROCEDURE [dbo].[GetStudentsByUserId] 
     @userId UNIQUEIDENTIFIER, 
     @roleType bit 
    AS 
    SET NOCOUNT ON; 
     DECLARE @classId UNIQUEIDENTIFIER 

     EXEC [dbo].[GetClassId] @userId,@classId OUTPUT 

     SELECT 
      B.StudentId, 
      B.StudentName, 
      B.Description, 
      B.StudentType 
     FROM 
      ClassStudents A 
     INNER JOIN 
      Student B 
     ON 
      B.StudentId = A.StudentId 
     WHERE 
      A.CassId = @classId 
     AND 
     ( 
        (B.StudentType in (2) and 
      and  @roleType=1) 
     OR 
      (B.StudentType in (1,4) and 
      and  @roleType=0) 
     ) 
Смежные вопросы