此存储过程具有来自两个不同表的3个函数。
如果表B中的行确实存在qty字段。
如果表B中不存在该行,请从表A中插入。
最后将表A和表B中的数量相加,并使用新的求和值更新表B数量字段。
我唯一的问题是存储过程对表B中的每一行求和,而不是正确的行或插入的新行。可以用一些方向来解决? 提前谢谢。
PROCEDURE [dbo].[XXXXXXXXXXXX]
@VendorAccountID int,
@pocomment text,
@sqlident int output
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Rowcount INT; --newly declared, not assigned. NULL
INSERT INTO InventoryMaster_tbl(InvManufacture, InvModel,
InvManPartNumber, InvDescription, InvLastPO, InvLastVendor)
SELECT TOP 1
PartOrderManufacture, PartOrderModel, PartManufPartNum,
PartOrderDesc, POID, VendorAccountID
FROM
PurchaseOrderTmp_tbl
WHERE
NOT EXISTS (SELECT 1
FROM InventoryMaster_tbl
WHERE InvManPartNumber = PartManufPartNum)
SET @Rowcount = @@ROWCOUNT
INSERT INTO [PurchaseOrder_tbl] ([POVendorID], [pocomment])
VALUES (@VendorAccountID, @pocomment)
SET @sqlident = SCOPE_IDENTITY()
UPDATE [PurchaseOrderTmp_tbl]
SET POID = @sqlident
UPDATE [PurchaseOrder_tbl]
SET POTicketNumber = [PartOrderTicketID]
FROM PurchaseOrderTmp_tbl
WHERE PurchaseOrder_tbl.POID = @sqlident
INSERT INTO PurchaseOrderItems_tbl(POID, VendorAccountID, POTicketID,
POInvItemID, POLineItemQty, PartManufPartNum, PartOrderDesc,
PartOrderManufacture, PartOrderModel, POType, PODescription,
POStatusID, PartRequestedBy, POGLCode)
SELECT
POID, VendorAccountID, PartOrderTicketID, PartInvID,
POItemQty, PartManufPartNum, PartOrderDesc, PartOrderManufacture,
PartOrderModel, POType, PODescription, POStatusID, PartRequestedBy, POGLCode
FROM
PurchaseOrderTmp_tbl
UPDATE [InventoryMaster_tbl]
SET InvTotalQtyOnOrder = InvTotalQtyOnOrder + POLineItemQty
FROM InventoryMaster_tbl
INNER JOIN PurchaseOrderItems_tbl PartManufPartNum ON PartManufPartNum = InvManPartNumber
WHERE InvManPartNumber = PartManufPartNum
DELETE PurchaseOrderTmp_tbl
END
这是我要感谢大家输入的最终结果:USE
GO
/****** Object: StoredProcedure [dbo].[TestPurchaseOrderCreateNew] Script Date: 8/4/2016 6:15:02 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[XXXXXXXXXXX]
-- Add the parameters for the stored procedure here
@VendorAccountID int,
@pocomment text,
@sqlident int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--newly declared, not assigned. NULL
INSERT INTO InventoryMaster_tbl
(InvManufacture,InvModel,InvManPartNumber,InvDescription,InvLastPO,InvLastVendor)
Select TOP 1 PartOrderManufacture,PartOrderModel,PartManufPartNum,PartOrderDesc,POID, VendorAccountID
From PurchaseOrderTmp_tbl
WHERE NOT EXISTS (Select 1
FROM InventoryMaster_tbl
WHERE InvManPartNumber = PartManufPartNum
)
INSERT INTO [PurchaseOrder_tbl]
([POVendorID],[pocomment])
Values (@VendorAccountID,@pocomment)
SET @sqlident = SCOPE_IDENTITY()
UPDATE [PurchaseOrderTmp_tbl]
SET POID = @sqlident
UPDATE [PurchaseOrder_tbl]
Set POTicketNumber = [PartOrderTicketID]
From PurchaseOrderTmp_tbl
Where PurchaseOrder_tbl.POID = @sqlident
INSERT INTO PurchaseOrderItems_tbl
(POID,VendorAccountID,POTicketID,POInvItemID,POLineItemQty,PartManufPartNum,PartOrderDesc,PartOrderManufacture,PartOrderModel,POType,PODescription,POStatusID,PartRequestedBy,POGLCode)
Select POID, VendorAccountID, PartOrderTicketID, PartInvID, POItemQty,PartManufPartNum,PartOrderDesc,PartOrderManufacture,PartOrderModel,POType,PODescription,POStatusID,PartRequestedBy,POGLCode
From PurchaseOrderTmp_tbl
UPDATE [InventoryMaster_tbl]
SET InvTotalQtyOnOrder +=
(SELECT SUM(POItemQty) FROM PurchaseOrderTmp_tbl WHERE InvManPartNumber = PartManufPartNum)
FROM InventoryMaster_tbl
WHERE InvManPartNumber IN (SELECT PartManufPartNum FROM PurchaseOrderTmp_tbl)
Delete PurchaseOrderTmp_tbl
END
答案 0 :(得分:-1)
为什么不将SET语句更改为InvTotalQtyOnOrder + = 1,如果您只想增加计数?
此外,WHERE子句是多余的,因为您的INNER JOIN使用相同的列标准,因此您已经限制为该数据子集。
编辑:在讨论问题后,我想我对你想要的结果有了更好的了解。尝试使用此更新语句而不是第3次更新时使用的更新语句,看看它是否符合您的要求
UPDATE [InventoryMaster_tbl]
SET InvTotalQtyOnOrder += (SELECT SUM(POLineItemQty) FROM PurchaseOrderItems_tbl WHERE InvManPartNumber = PartManufPartNum)
FROM InventoryMaster_tbl
编辑2:将WHERE子句添加到UPDATE以仅更新采购订单临时表中包含制造部件号的记录,以便仅更新新的采购订单。
UPDATE [InventoryMaster_tbl]
SET InvTotalQtyOnOrder +=
(SELECT SUM(POLineItemQty) FROM PurchaseOrderItems_tbl WHERE InvManPartNumber = PartManufPartNum)
FROM InventoryMaster_tbl
WHERE InvManPartNumber IN (SELECT PartManufPartNum FROM PurchaseOrderTmp_tbl)