【问题标题】:MSSQL Stored Procedure with dynamically added WHERE?动态添加 WHERE 的 MSSQL 存储过程?
【发布时间】:2017-04-22 03:53:52
【问题描述】:

我有这个存储过程,我需要检查@DateChk == 1,然后我想在 SP 中的 SQL 语句中添加 WHERE 子句。如果为 0,则不应有任何 WHERE 子句。

我如何编写这样的函数?在一个程序中,我可以只构建要传递给服务器的字符串,但我还没有找到在 SQL 服务器中执行此操作的任何方法。

SELECT  dateDay, SUM(nok) as NOK, SUM(ok) as OK,  (SUM(ok) + SUM(nok)) as 'Total'
FROM #st
SELECT CASE @DateChk
WHEN 1: WHERE dateDay BETWEEN '2016-08-01' AND '2016-08-31'

类似这样,如果@DateChk = 1,则应添加 WHERE,否则获取所有记录。

【问题讨论】:

    标签: sql sql-server stored-procedures dynamic


    【解决方案1】:

    你可以这样修改你的条件:

    SELECT  dateDay, SUM(nok) as NOK, SUM(ok) as OK,  (SUM(ok) + SUM(nok)) as 'Total'
    FROM #st
    WHERE 
    (@DateChk = 1 and (dateDay BETWEEN '2016-08-01' AND '2016-08-31'))
    or @DateChk = 0
    

    它会完全匹配您想要的行为:dateDay 上的条件仅适用于 @DateChk = 1

    【讨论】:

    • 谢谢,这帮助很大。
    • 另一个问题。如果我还有 2 个 BIT,我想做 IF 吗?如果 DateChk = 0,但 ArtNrChk 为 1,或者两者均为 1 等?我目前有 4 个复选框来选择要显示/过滤的内容。
    • @StefanGrönberg 然后可以应用相同的逻辑。只需根据新逻辑修改您的where 条件,例如“((some_condition)和(要应用的附加条件))或(some_condition 的否定)”
    • 好的,再次感谢@Andy Korneyev。开始掌握这个 and-oring,现在它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多