簡體   English   中英

SQL 服務器 - 存儲過程意外結果

[英]SQL Server - Stored Proc Unexpected Result

CREATE PROC [dbo].[SP_GetListOfGoodsReceiptNote] (@MinDate AS DATETIME, @MaxDate AS DATETIME, @CompanyID AS INT, @ProductID AS INT = NULL, @TradePartnerID AS INT = NULL, @PurchaseOrderID AS INT = NULL)
AS
BEGIN
    SELECT 
        CVH.ID, CVH.VoucherTypeID, CVH.VoucherDate, CVH.VoucherNumber, CVH.CompanyID, CVH.ReferenceVoucherID, CVH.VoucherAmount, CVH.VoucherStatus, CCP.TradePartnerID, CPMR.PartnerName
    FROM
        CruxVoucherHeader CVH
        LEFT OUTER JOIN CruxCorePurchase CCP ON CCP.VoucherHeaderID = CVH.ID
        LEFT OUTER JOIN CruxPartnerMaster CPMR ON CCP.TradePartnerID = CPMR.ID
        LEFT OUTER JOIN CruxVoucherBody CVB ON CVB.VoucherHeaderID = CVH.ID
    WHERE 
        CVH.VoucherDate >= @MinDate 
        AND CVH.VoucherDate <= @MaxDate
        AND CVH.CompanyID = @CompanyID
        AND CVH.VoucherTypeID = 3
        AND @ProductID IS NULL OR CVB.ProductID = @ProductID        
        AND @TradePartnerID IS NULL OR CCP.TradePartnerID = @TradePartnerID
        AND @PurchaseOrderID IS NULL OR CVH.ReferenceVoucherID = @PurchaseOrderID
END

我在從上述存儲過程中獲得預期結果時遇到了一些問題。 如果您看到,我已經使用 CVH.VoucherTypeID = 3 過濾了數據,但仍然由於某些未知原因,我得到了附加的結果。 我在編寫存儲過程時是否犯了任何概念上的錯誤。 ?

這就是我執行存儲過程的方式。

EXEC SP_GetListOfGoodsReceiptNote '2020/01/01','2021/02/02', 2, NULL, 74, NULL

執行存儲過程的結果

由於And運算符優先於Or運算符,因此,如果存在表達式 A = B and A = B and C is null or C = D運算符部分將在or之前計算

因此,如果您需要制作or部分評估首先需要放在括號中為A = B and (C is null or C = D)

所以WHERE子句看起來需要如下括號:

WHERE CVH.VoucherDate >= @MinDate AND
      CVH.VoucherDate <= @MaxDate AND
      CVH.CompanyID = @CompanyID AND
      CVH.VoucherTypeID = 3 AND
      (@ProductID IS NULL OR CVB.ProductID = @ProductID) AND        
      (@TradePartnerID IS NULL OR CCP.TradePartnerID = @TradePartnerID) AND
      (@PurchaseOrderID IS NULL OR CVH.ReferenceVoucherID = @PurchaseOrderID)

有關運算符優先級的更多信息,請點擊此鏈接

暫無
暫無

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

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