运行特殊过程时发生AdventureWorks 2012 SQL错误



我正在创建一个特殊过程,将输入的折扣应用于输入的应用数量,但我一直收到PK不能为空的错误。为什么它不自动增加行?

GO
CREATE PROCEDURE Sales.uspExcesInvSale
@DiscountPct smallmoney,
@ProductInventory int
AS
SET IDENTITY_INSERT Sales.SpecialOffer ON
INSERT INTO Sales.SpecialOffer (SpecialOfferID, Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty)
VALUES ((SELECT MAX(SpecialOfferID)+1 FROM SpecialOffer), 'New Sale', @DiscountPct, 'Excess Inventory', 'Direct', DATEADD(DAY,5,GETDATE()), DATEADD(DAY,7,GETDATE()), @ProductInventory);
INSERT INTO Sales.SpecialOfferProduct (ProductID)
SELECT ProductID
FROM Production.ProductInventory 
GROUP BY ProductID 
HAVING SUM(Quantity) > (@ProductInventory)
SET IDENTITY_INSERT Sales.SpecialOffer OFF;
GO
BEGIN TRY
EXEC Sales.uspExcesInvSale .5, 1800;
END TRY
BEGIN CATCH
SELECT  
ERROR_NUMBER() AS ErrorNumber  
,ERROR_SEVERITY() AS ErrorSeverity  
,ERROR_STATE() AS ErrorState  
,ERROR_PROCEDURE() AS ErrorProcedure  
,ERROR_LINE() AS ErrorLine  
,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;
GO

收到的错误为错误编号515严重性16错误状态2错误过程Sales.uspExcesInvSale错误行9错误消息无法将值NULL插入表"AdventureWorks2012.Sales.SpecialOfferProduct"的"SpecialOfferID"列中;列不允许为null。INSERT失败。

错误在这里-您没有为SpecialOfferID插入值,这是该表所必需的。

INSERT INTO Sales.SpecialOfferProduct (ProductID)   -- These should have
SELECT ProductID                                -- SpecialOfferID as well
FROM Production.ProductInventory 
GROUP BY ProductID 
HAVING SUM(Quantity) > (@ProductInventory)

我相信这两张桌子的PKs是

  • SpecialOffer:称为SpecialOfferID、int、IDENTITY的单列(例如,是自动增量(
  • SpecialOfferProduct:两个int列,其中只有一个是IDENTITY。另一个是SpecialOfferID

因此,在插入SpecialOfferProduct时,您需要明确指定SpecialOfferID,因为它不是自动输入的。PK的另一部分(我相信是SalesOrderDetailID(是一个标识,您可以让它来完成它的工作。

相比之下,鉴于SpecialOffer的PK是一个IDENTITY专栏,我建议让它来做它的工作。删除IDENTITY_INSERTSET语句,然后不要在INSERT语句中包含值。它将自动创建下一个ID值。

我猜您想从第一个插入(例如,从SpecialOffer(中获得相关的SpecialOfferID,然后在第二个插入中使用该ID(例如,到SpecialOfferProduct中(。

您可以使用SCOPE_IDENTITY((获取"最后插入的ID"。

通过这些更改,这里有一组示例代码(遗憾的是,由于我没有设置数据库,因此未经测试(。

注意-我也不能100%确定你在用这些插件做什么(尤其是第二个(-你需要检查它是否在做你想要的事情。这个答案与错误有关,不能做插入

DECLARE @NewID int
INSERT INTO Sales.SpecialOffer (Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty)
VALUES ('New Sale', @DiscountPct, 'Excess Inventory', 'Direct', DATEADD(DAY,5,GETDATE()), DATEADD(DAY,7,GETDATE()), @ProductInventory);
SET @NewID = SCOPE_IDENTITY()
INSERT INTO Sales.SpecialOfferProduct (SpecialOfferID, ProductID)
SELECT @NewID, ProductID
FROM Production.ProductInventory 
GROUP BY ProductID 
HAVING SUM(Quantity) > (@ProductInventory)

最新更新