【问题标题】:How to convert complex block condition in to MSSQL procedure如何将复杂的块条件转换为 MSSQL 过程
【发布时间】:2019-02-27 04:25:22
【问题描述】:

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

例如:

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 不接受这个(它接受布尔参数)

有人可以帮助我吗?谢谢你。

【问题讨论】:

  • 您能否给出您想要的明确信息,并提供可能帮助我们给出正确答案的示例数据。
  • 您可以使用此链接中所述的条件 where 子句stackoverflow.com/questions/10521677/…

标签: sql sql-server database


【解决方案1】:

你可以如下使用它

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

根据您的编码方便性选择逻辑。但是上面的方法会起作用

【讨论】:

  • 感谢您的好评。这种方法工作预期。希望这个答案可以帮助其他人解决与我类似的问题。
【解决方案2】:

也许你可以在 where 条件下尝试这样的事情:-

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

所以你的 where 条件可以像

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

....等等....

【讨论】:

  • 我会尽快尝试您的方法并反馈。感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2019-11-04
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多