如何将复杂的块条件转换为MSSQL过程

时间:2019-02-27 04:25:23

标签: sql sql-server database

我有一些复选框(“条件过滤器”),用户可以勾选它以选择过滤器条件

例如:

CheckBox 1 : OrderNumber
CheckBox 2 : Driver
CheckBox 3 : Code
...

并传递到存储过程-这样的事情:

ALTER PROCEDURE [dbo].[DailyBatchSummaryReport_NoGroup]
@FromDatePara Datetime,
@ToDatePara Datetime,
@SeleRecipe nvarchar(max),
@SeleOrder nvarchar(max),
@SeleCustomer nvarchar(max),
@SeleSite nvarchar(max),
@SeleTruck nvarchar(max),
@SeleDriver nvarchar(max),
AS
BEGIN

//此时卡住

我想编写一个可以处理用户选择多例的过程,我对字符串生成器有想法,并传入WHERE子句,但是SQLSERVER不接受此(它接受布尔参数)

有人可以帮我吗。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以按以下方式使用它

ALTER PROCEDURE [dbo].[DailyBatchSummaryReport_NoGroup]
@FromDatePara Datetime,
@ToDatePara Datetime,
@SeleRecipe nvarchar(max),
@SeleOrder nvarchar(max),
@SeleCustomer nvarchar(max),
@SeleSite nvarchar(max),
@SeleTruck nvarchar(max),
@SeleDriver nvarchar(max),
AS
BEGIN

将@SeleOrder,@SeleCustomer值传递为0(表示未选中)和1(表示选中的复选框)

select * from
yourtable
where 
OrderNumber= CASE WHEN @SeleOrder = '0' THEN OrderNumber ELSE @SeleOrder END
AND
CUSTOMER= CASE WHEN @SeleCustomer = '0' THEN CUSTOMER ELSE @SeleCustomer END
AND
Driver= CASE WHEN @SeleDriver = '0' THEN Driver ELSE @SeleDriver END

确保您将默认值传递为0。在这里,您已将数据类型选择为nvarchar(max),因此我已将其写为“ 0”,否则,如果您传递的只是int值,则可以写为0。或者您可以将默认值设置为0

 ALTER PROCEDURE [dbo].[DailyBatchSummaryReport_NoGroup]
    @FromDatePara Datetime,
    @ToDatePara Datetime,
    @SeleRecipe int  = 0,
    @SeleOrder int  = 0,
    @SeleCustomer int  = 0,
    @SeleSite int  = 0,
    @SeleTruck int  = 0,
    @SeleDriver int  = 0,
    AS
    BEGIN

根据您的编码方便选择逻辑。但以上方法可以使用

答案 1 :(得分:0)

也许您可以在以下情况下尝试这样的事情:-

如果用户选中复选框,则传递相应的值或传递null。

所以您的情况可能像

Where
(Colname1 = @Paramenter1 or @Paramenter1 is null)
and 
(Colname2 = @Paramenter2 or @Paramenter2 is null)

....等等....