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