繁体   English   中英

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

[英]Using If/Then/Else in a stored procedure in 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#侧放置了“全选”选项,并将值设置为0。

我想做的是将ROLE_ID和FUNCTION_ID过滤器更改为使用LIKE而不是= ,然后在顶部使用If / Then / Else语句说:“如果@MyRole的值为0,请将其更改为&“ 或者其他的东西。

在SQL Server中甚至有可能吗?

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

我建议当选择“全选”时,将NULL值传递给所需的参数,然后像这样重写条件:

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

编辑(+ note)请勿将特定值用作“未指定值”,因为SQL中已包含该符号: NULL

如果我正确遵循,则可以通过在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过滤,如果需要对它们进行独立评估,则必须添加其他逻辑。

如果选择了“全选”,则下面的ID为NULL,并如下所示修改查询。

AND ROLE_ID = ISNULL(@MyRole,ROLE_ID)

AND FUNCTION_ID =ISNULL(@MyFunction, FUNCTION_ID)

您可以拥有一个字符串变量,在if then语句中根据参数值设置所需的select语句,然后执行sqlString

顺便说一句,为了回答我原来的问题(现在我看到这个问题有超过1,000个匹配),我在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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM