簡體   English   中英

如果傳遞零,則跳過參數化存儲過程

[英]Parameterized stored procedure skip if when zero is passed

我希望能夠在將零傳遞給存儲過程時處理參數。 如果參數為零,我們將忽略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 個倉庫,它們的 ID 為 1、2 和 3。

如果我將它作為零傳遞,我的查詢將失敗,因為如果零作為參數傳遞,它不會匹配我需要返回的所有 3 個倉庫。

您可以添加 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')

我想你想要:

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

另一種選擇是最大限度地使用sqlserver iif函數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM