繁体   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