2011-10-28 36 views
0

的,我在我的存储过程,需要问题与包括根据参数

  • 如果@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 

我很困惑!

+0

这就是所谓的商店* d *程序 - 如** **存储在SQL Server中 - 它没有任何关系“存储”。此外:如果你只有一个字符 - 使它成为一个'CHAR(1)' - 不需要使它成为'VARCHAR(1)'(它至少有2个字节开销!) –

回答

1

您的逻辑处理@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 
+0

谢谢你的帮助,我写了像这样,但我认为不是为了高效,因为我的查询不是像这个样本一样简单,我必须在将来非常小心地维护它。 – user1004299

+0

@ user1004299:为什么不高效?我认为这是你可以做的最好的事情,因为在一种情况下,你必须有这个额外的限制,而在另一种情况下,你不会......真的没有什么好的方法来建模,否则...... 。 –