[英]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_ID
和FUNCTION_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_ID
和FUNCTION_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.