簡體   English   中英

INSERT語句與CHECK約束沖突(使用UDF檢查)

[英]INSERT statement conflicted with the CHECK constraint (check with UDF)

我正在使用庫存管理系統,在該系統中,必須將銷售訂單項與采購訂單項相關聯才能計算利潤。 為了按購買行跟蹤可用物料,我編寫了一個函數,並將其用於CHECK約束中,但是盡管數量少於可用數量,但插入查詢還是有沖突。

我嘗試成功更改[Qty] ,成功插入一半或更少的可用數量,但是相等或更少的數量無效。

這是我的桌子

CREATE TABLE [dbo].[tSaleLineItem]
(
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [InvoiceId] [INT] NOT NULL,
    [proId] [INT] NOT NULL,
    [Qty] [INT] NOT NULL,
    [Price] [FLOAT] NOT NULL,
    [PurchaseId] [INT] NOT NULL,
    [IsActive] [BIT] NOT NULL
)

我的檢查約束條件

[dbo].[fnGetStockByPurchase]([PurchaseId]) >= [Qty]

我的功能定義為

RETURN 
    (ISNULL((SELECT Qty FROM tPurchaseLineItem 
             WHERE Id = @PurchaseId AND IsActive = 1), 0)
    - ISNULL((SELECT SUM(Qty) FROM tSaleLineItem 
              WHERE PurchaseId = @PurchaseId AND IsActive = 1), 0))

這就是我正在嘗試的

SELECT * 
FROM tPurchaseLineItem

SELECT dbo.fnGetStockByPurchase(4)

INSERT INTO tSaleLineItem(InvoiceId, proId,Qty,Price, PurchaseId) 
VALUES (2, 1, 10, 100, 4)

消息選項卡顯示

(3 rows affected)

(1 row affected)

消息547,級別16,狀態0,第7行
INSERT語句與CHECK約束“ CK_tSaleLineItem_Qty”沖突。 數據庫“ testDb”的表“ dbo.tSaleLineItem”中發生了沖突。

結果標簽顯示

Id  InvoiceId   proId   Qty Price   IsActive
--------------------------------------------
4   2           1       10  100     1
5   2           1       10  100     1
6   2           1       10  100     1

(No column name)
10

我希望我當前的INSERT查詢插入數據,因為[Qty]等於可用數量。

不應該是:

RETURN 
(ISNULL((SELECT SUM(Qty) FROM tSaleLineItem 
         WHERE Id = @PurchaseId AND IsActive = 1), 0)
- ISNULL((SELECT Qty FROM tPurchaseLineItem 
          WHERE PurchaseId = @PurchaseId AND IsActive = 1), 0))

因為如果您有兩個Purchases函數將返回負值,從而違反約束

我通過轉換為以下代碼塊調試了函數體

DECLARE @PurchaseId INT;
DECLARE @Qty INT;
DECLARE @QtyP INT;
DECLARE @QtyS INT;
SET @PurchaseId=4;
SET @Qty =10;

SELECT @QtyS =  ISNULL(SUM(Qty),0) FROM tSaleLineItem 
         WHERE PurchaseId = @PurchaseId AND IsActive = 1;
SELECT @QtyP =  ISNULL(SUM(Qty),0) FROM tPurchaseLineItem 
         WHERE Id = @PurchaseId AND IsActive = 1;
PRINT 'QtyP';
PRINT @QtyP;
PRINT 'QtyS';
PRINT @QtyS;
PRINT 'QtyP-QtyS';
PRINT @QtyP - @QtyS

IF((@QtyP-@QtyS)>=@Qty)
          PRINT 'True';
ELSE
          PRINT 'False';

我發現的是SUM()ISNULL()順序。 在我的問題中,我將其編寫為ISNULL(SUM)) ,結果為空,而SUM(ISNULL())結果為零,盡管在兩種情況下tSaleLineItem中都沒有行。 上述區塊導致

 QtyP 10 QtyS 0 QtyP-QtyS 10 True 

盡管我仍然想知道為什么它插入了一半或更少的數量,盡管現在不是頭疼的問題。

總結仍然讓我震驚。 我也不明白。

DECLARE @QtyS INT;

SELECT @QtyS =  SUM(ISNULL(Qty,0)) FROM tSaleLineItem 
PRINT 'QtyS';
PRINT @QtyS;

SELECT @QtyS =  ISNULL(SUM(Qty),0) FROM tSaleLineItem 
PRINT 'QtyS';
PRINT @QtyS;

輸出是

 QtyS QtyS 0 

但是,謝謝大家的寶貴意見和幫助。

暫無
暫無

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

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