您的逻辑处理@var_exclude
是错误的。因为在这种情况下,使用您的CASE子句的when @var_exclude= 'Y' Then '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'
:
当你通过@var_exclude = 'Y'
,然后将查询基本得到解决到。
如果你通过了其他任何东西,那么你就获得了你传递的价值;所以,如果你在@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'
,因为在这种情况下,你的CASE子句的Else @var_exclude
使用 - 而且由于@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
这就是所谓的商店* d *程序 - 如** **存储在SQL Server中 - 它没有任何关系“存储”。此外:如果你只有一个字符 - 使它成为一个'CHAR(1)' - 不需要使它成为'VARCHAR(1)'(它至少有2个字节开销!) –