在SQL Server 2008中的存储过程中使用If / Then / Else

时间:2014-06-03 16:52:47

标签: sql sql-server-2008

我有一个存储过程,我正在从C#应用程序传递值。我需要做的是根据应用程序下拉列表中的选择过滤数据。所以,我有这样的事情:

ALTER procedure [dbo].[usp_AllCompletedTasks]
    @StDate smalldatetime,
    @EnDate smalldatetime,
    @xRole int,
    @xFunction int
AS

BEGIN

declare @StrDate smalldatetime,
        @EndDate smalldatetime,
        @MyRole int,
        @MyFunction int

set @StrDate = @StDate 
set @EndDate = @EnDate 
set @MyRole = @xRole 
set @MyFunction = @xFunction 

SELECT 
   ... Some Fields    
FROM MyTable    

WHERE   
    AND Work_Start >= DATEADD(dd,0,DATEDIFF(dd,0,@strDate))
    AND Work_End <= DATEADD(dd,1,DATEDIFF(dd,0,@endDate))
    AND ROLE_ID = @MyRole
    AND FUNCTION_ID = @MyFunction

现在,楼上的权力决定了他们想要在角色和功能下拉列表中选择“全选”选项。所以,我所做的是在C#端放入一个Select All选项并将值设置为0.

我想我要做的是更改ROLE_ID和FUNCTION_ID过滤器以使用 LIKE 而不是 = ,然后使用if / Then / Else语句最重要的是,“如果@MyRole的值为0,则将其更改为&amp;”或者其他的东西。

这在SQL Server中是否可行?

5 个答案:

答案 0 :(得分:1)

由于ROLE_IDFUNCTION_ID列是整数,因此您必须将它们转换为其中一种字符类型才能使用LIKE运算符。

我建议当选择“全选”时,将NULL'值'传递给所需的参数并重写您的条件,如下所示:

AND (@MyRole IS NULL OR ROLE_ID = @MyRole)
AND (@MyFunction IS NULL OR FUNCTION_ID = @MyFunction)

编辑(+注释) 不要将特定值用作“未指定的值”,SQL中已有该符号:NULL

答案 1 :(得分:0)

如果我正确遵循,只需在WHERE条款中添加其他条件即可获得所需内容:

WHERE   
    AND Work_Start >= DATEADD(dd,0,DATEDIFF(dd,0,@strDate))
    AND Work_End <= DATEADD(dd,1,DATEDIFF(dd,0,@endDate))
    AND ((ROLE_ID = @MyRole AND FUNCTION_ID = @MyFunction)
         OR (@MyRole = 0 AND @MyFunction = 0))

如果您的变量为0,则结果不会被ROLE_IDFUNCTION_ID过滤,如果需要单独评估,则必须添加其他逻辑。

答案 2 :(得分:0)

如果选择全选,则将以下ID设为NULL并修改您的查询,如下所示。

AND ROLE_ID = ISNULL(@ MyRole,ROLE_ID)

AND FUNCTION_ID =ISNULL(@MyFunction, FUNCTION_ID)

答案 3 :(得分:0)

你可以有一个字符串变量,根据if then语句中的参数值设置你想要的select语句,然后执行sqlString

答案 4 :(得分:0)

顺便说一下,为了回答我原来的问题(现在我发现这个问题有超过1000次点击),我在Access中发现了类似的内容:

SELECT FirstName, LastName, TelephoneNumber, 
     IIf(IsNull(TelephoneInstructions),"Any time",
     TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo; 

将在SQL Server中编写类似的内容:

SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = 
     CASE
          WHEN TelephoneInstructions IS NULL THEN 'Any time'
          ELSE TelephoneInstructions
     END
FROM db1.ContactInfo;
相关问题