Ваша логическая обработка @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