【问题标题】:Parameterized stored procedure skip if when zero is passed如果传递零,则参数化存储过程跳过
【发布时间】:2020-03-22 12:51:51
【问题描述】:

我希望能够在将零传递给存储过程时处理参数。如果参数为零,我们忽略AND 语句。

这是我的程序:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
    @WarehouseId INT = 0,
    @CreatedFromUtc DATETIME = NULL,
    @CreatedToUtc DATETIME = NULL
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX)

    SET NOCOUNT ON;

    SELECT TOP 100 *
    FROM [Test].[dbo].[Order] WITH (NOLOCK)
    WHERE
        [Deleted] = 0
        AND [WarehouseId] = @WarehouseId
        AND [CreatedOnUtc] >= ISNULL(@CreatedFromUtc, '1/1/1900')
        AND [CreatedOnUtc] < ISNULL(@CreatedToUtc, '1/1/2999')
END

我想要某种条件,仅当仓库 id 大于 0 时才运行这部分查询

AND [WarehouseId] = @WarehouseId

类似:

IF (@WarehouseId > 0)
    AND [WarehouseId] = @WarehouseId

我真的需要这个,因为在数据库中有3个仓库,分别是1、2和3。

如果我将它作为零传递,我的查询将失败,因为如果零作为参数传递,我需要返回的所有 3 个仓库都不匹配。

【问题讨论】:

    标签: sql sql-server parameters conditional-statements parameter-passing


    【解决方案1】:

    我想你想要:

    AND ([WarehouseId] = @WarehouseId OR @WarehouseId = 0)
    

    【讨论】:

    • 啊,是的,这样做的,有什么逻辑?
    • @chrisc。 . .这是一个简单的OR 条件。这似乎是你想要的。
    【解决方案2】:

    可以添加case语句

        SELECT TOP 100 *
        FROM [Test].[dbo].[Order] with (NOLOCK)
    
    WHERE
        [Deleted] = 0
    
    AND [WarehouseId] = case when @WarehouseId>0 then @WarehouseId else [WarehouseId] end
    AND [CreatedOnUtc] >= ISNULL(@CreatedFromUtc, '1/1/1900')
    AND [CreatedOnUtc] < ISNULL(@CreatedToUtc, '1/1/2999')
    

    【讨论】:

    • 这就是答案
    • 我可以看到这也有效,所以它值得一票,但我同意戈登·林诺夫的回答是我会同意的
    【解决方案3】:

    另一种选择是最大化使用sqlserveriif函数

    and iif(@WarehouseId = 0, [WarehouseId], @WarehouseId) =  [WarehouseId]
    

    【讨论】:

    • @Metal 我得到错误```在预期条件的上下文中指定的非布尔类型的表达式```
    • @chrisc,哈哈,错字忘记列了,再试一次
    • 嗯,是的,现在可以了。但是,您提供的解决方案与 Gordon Linoff 提供的答案不同。你知道为什么吗 ?谢谢
    • 如果你有空值。它将被包括在内
    • 是的,试试这个SELECT TOP 100 * FROM [Test].[dbo].[Order] where coalesce(WarehouseId, 0) = 0
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2012-11-21
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多