[英]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.