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