2

注文の詳細をテーブルに挿入するトリガーが注文テーブルにありorder_detailsます。これは、1つの行のみが入力された場合に機能しますが、複数の行が同時に挿入された場合は機能しません。>カーソルの使用について、さまざまなサイトで複数のスレッドを読みました。一方、ステートメント、一時テーブルなどです。いくつか試しましたが、成功しませんでした。注文時にすべての詳細な行が追加されるようにするための最良/最も簡単な方法に関する提案。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[CreateOrderDetails]
ON [dbo].[Orders]
FOR INSERT 
AS
    declare @OrderStagingId uniqueidentifier
    declare @OrderType as varchar(50)
    declare @OrderID uniqueidentifier
    declare @LocationID uniqueidentifier
    declare @status as varchar (25)
    declare @vendorid as uniqueidentifier

     SELECT @OrderID = OrderID, @LocationID = LocationID, 
            @vendorid = vendorid, @OrderStagingId = OrderStagingId
     FROM inserted

     Begin

    SET NOCOUNT ON;

     -- Insert statements for trigger here

     Insert into [Brain].dbo.[Order_Details]

     SELECT     
        NEWID() AS OrderDetailId, @OrderID AS OrderId, 
        dbo.OrderStaging_Details.EcProductID,    
        dbo.OrderStaging_Details.Qty, dbo.OrderStaging_Details.Qty_Type, 
        dbo.OrderStaging_Details.Cost, dbo.OrderStaging_Details.Ext_Cost, 
        dbo.OrderStaging_Details.EnteredBy,
        NULL AS ReceivedBy, NULL AS ReceivedDate, NULL AS ReceivedQty, 
        dbo.OrderStaging_Details.OrderNote, NULL AS ReceivedNote,    
        dbo.OrderStaging_Details.UpdatedBy, dbo.OrderStaging_Details.UpdateDate
     FROM         
        dbo.Vendor_Assigned_Locations 
     INNER JOIN
        dbo.Vendor_Contacts 
     INNER JOIN
        dbo.Vendors 
     INNER JOIN
        dbo.OrdersStaging 
     INNER JOIN
        dbo.OrderStaging_Details ON dbo.OrdersStaging.OrderStagingID = dbo.OrderStaging_Details.OrderStagingID 
            ON dbo.Vendors.VendorID = dbo.OrderStaging_Details.VendorId 
            ON dbo.Vendor_Contacts.Vendor_ID = dbo.Vendors.VendorID 
            ON dbo.Vendor_Assigned_Locations.LocationID = dbo.OrdersStaging.LocationID 
               AND dbo.Vendor_Assigned_Locations.VCID = dbo.Vendor_Contacts.VCID 
     INNER JOIN
        dbo.Orders ON dbo.OrdersStaging.OrderStagingID = dbo.Orders.OrderStagingID 
                   AND dbo.Vendors.VendorID = dbo.Orders.VendorID 
                   AND dbo.Vendor_Contacts.VCID = dbo.Orders.VendorContactID 
                   AND dbo.OrdersStaging.LocationID = dbo.Orders.LocationID 
     LEFT OUTER JOIN
        dbo.Order_Details ON dbo.Orders.OrderID = dbo.Order_Details.OrderID
     WHERE     
        (dbo.OrderStaging_Details.OrderStagingID = @OrderStagingID) 
        AND (dbo.OrdersStaging.LocationID = @Locationid)    
        AND (dbo.Vendors.VendorID = @Vendorid) 
        AND (dbo.Order_Details.OrderID IS NULL)
     end
4

3 に答える 3

0

このトリガーはおそらくあなたに必要です

ALTER TRIGGER [dbo].[CreateOrderDetails] ON [dbo].[Orders]
FOR INSERT 
AS 
BEGIN
  SET NOCOUNT ON;    
  -- Insert statements for trigger here    
  INSERT INTO [Brain].dbo.[Order_Details]    
  SELECT     
    NEWID() AS OrderDetailId, i.OrderID AS OrderId, 
    dbo.OrderStaging_Details.EcProductID,    
    dbo.OrderStaging_Details.Qty, dbo.OrderStaging_Details.Qty_Type, 
    dbo.OrderStaging_Details.Cost, dbo.OrderStaging_Details.Ext_Cost, 
    dbo.OrderStaging_Details.EnteredBy,
    NULL AS ReceivedBy, NULL AS ReceivedDate, NULL AS ReceivedQty, 
    dbo.OrderStaging_Details.OrderNote, NULL AS ReceivedNote,    
    dbo.OrderStaging_Details.UpdatedBy, dbo.OrderStaging_Details.UpdateDate
  FROM               
    dbo.OrdersStaging 
  INNER JOIN
    dbo.OrderStaging_Details ON dbo.OrdersStaging.OrderStagingID = dbo.OrderStaging_Details.OrderStagingID 
  INNER JOIN
    dbo.Vendors ON dbo.Vendors.VendorID = dbo.OrderStaging_Details.VendorId
  INNER JOIN
    dbo.Vendor_Contacts ON dbo.Vendor_Contacts.Vendor_ID = dbo.Vendors.VendorID 
  INNER JOIN          
    dbo.Vendor_Assigned_Locations ON dbo.Vendor_Assigned_Locations.LocationID = dbo.OrdersStaging.LocationID 
                                       AND dbo.Vendor_Assigned_Locations.VCID = dbo.Vendor_Contacts.VCID
  INNER JOIN
    dbo.Orders ON dbo.OrdersStaging.OrderStagingID = dbo.Orders.OrderStagingID 
                    AND dbo.Vendors.VendorID = dbo.Orders.VendorID 
                    AND dbo.Vendor_Contacts.VCID = dbo.Orders.VendorContactID 
                    AND dbo.OrdersStaging.LocationID = dbo.Orders.LocationID 
  INNER JOIN
    inserted i ON dbo.Orders.OrderID = i.OrderID
END
于 2013-02-20T21:38:16.617 に答える
0

@OrderID、@LocationID などをピックアップしている外側の select ステートメントは、トリガーをプルしたトランザクションに挿入されているすべての注文を含む、挿入された最初の行のみを選択しています。

Use insert into detail(...)
Select NewID(), Inserted.OrderID, ... 
From Inserted
inner join ...
Where etc

代わりは。

于 2013-02-20T20:47:51.453 に答える
0

それは、列ではなく行について考えているからです。@variables をダンプし、 に参加しinsertedます。

于 2013-02-20T20:48:55.583 に答える