我有一个存储过程,我正在从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中是否可行?
答案 0 :(得分:1)
由于ROLE_ID
和FUNCTION_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_ID
和FUNCTION_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;