Проблема с включением / исключением данных в моей хранимой процедуре в зависимости от параметра - PullRequest
0 голосов
/ 28 октября 2011

У меня была проблема в моей хранимой процедуре, которая должна включать строки или нет в зависимости от значения параметра

  • если @var_exclude = 'Y' Мне нужно показать только строки, которые mytable.field1 = 'N'
  • если @var_exclude = 'N' мне нужно показать все строки

Я использую следующий запрос, но он не работает должным образом

Мой код похож на

@var_exclude    varchar(1)

    select mytable.field1, mytable.field2, mytable.field3, mytable.field4,mytable.field5 
    from mytable
Where mytable.field6 is null
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and  mytable.field1 = Case when @var_exclude= 'Y' Then 'N' Else @var_exclude End
End

Я в замешательстве!

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Ваша логическая обработка @var_exclude неверна.

Когда вы передаете @var_exclude = 'Y', ваш запрос в основном разрешается в:

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

, поскольку в этом случае используется when @var_exclude= 'Y' Then 'N' часть вашего предложения CASE.

Если вы передаете что-то еще, вы берете значение, которое вы передаете; поэтому, если вы передадите @var_exclude = 'N', ваш запрос будет преобразован в:

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

, поскольку в этом случае используется Else @var_exclude вашего предложения CASE - и, поскольку @var_exclude = 'N', вы получаете точно такой же запрос, как и раньше ....

Я бы, наверное, написал эту процедуру примерно так:

CREATE PROCEDURE dbo.GetData 
     @paramstate VARCHAR(???),
     @var_exclude CHAR(1)
AS BEGIN 
   IF @var_exclude = 'N' THEN
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')

   ELSE
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')
         AND t.field1 = 'N'
END
0 голосов
/ 20 марта 2018

Эй, если кто-то все еще ищет что-то подобное, вы МОЖЕТЕ сделать это в предложении where, вам нужно написать оператор IN и оценить условие следующим образом:

DECLARE @Include bit
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)

Так что это будет оценивать:

IF @Include = 1 THEN 0,1
ELSEIF @Include = 0 THEN 0
END

Итак, все, что вам нужно сделать, это написать предложение IN в предложении WHERE.

SELECT * FROM store 
WHERE values IN (
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)
)

Надеюсь, это поможет кому-нибудь в будущем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...