当从 Table A 插入触发器时从 table B 获取插入的唯一标识符

Get inserted uniqueidentifier from table B when its inserted from Table A insert trigger

我不确定如何打开标题,但让我解释一下我的问题是什么。

我有两个 table,它们都使用 uniqueidentifier 作为 Id,它们是由 newsequentialid()

自动生成的

现在,当我对 table B 进行插入时,它运行 Insert 触发器,我在这个触发器中做了一些特定的事情,我也将一些值插入另一个 table 称为 A 和我需要检索这个 table A 插入的 ID,但我找不到解决方案。

另外让我解释一下为什么我需要这样的触发器。当用户创建包含产品的发票且其中包含库存信息时,此触发器负责创建包含 header 的库存交易和插入产品的详细信息(此库存详细信息 table 也有一个触发器并更新仓库)等

我希望这能给我一些提示,我正在尝试做什么

CREATE TRIGGER [dbo].[IT_TBLDebitInvoiceDetails] ON [dbo].[TBLDebitInvoiceDetails] AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    declare @cnt int;
    --HEADER
    declare @DocumentId uniqueidentifier;
    declare @OrganizationId uniqueidentifier;
    declare @Date date;
    declare @TermDate date;
    declare @DespatchDate date;
    declare @DespatchNo nvarchar(20);
    declare @WarehouseId uniqueidentifier;
    declare @CustomerId uniqueidentifier;
    declare @StockId uniqueidentifier;
    declare @CurrencyTypeId uniqueidentifier;
    declare @GrandTotal money;
    --Auditable
    declare @WhoCreated uniqueidentifier;
    declare @DateCreated datetime;
    declare @WhoUpdated uniqueidentifier;
    declare @DateUpdated datetime;
    --DETAIL
    declare @ProductId uniqueidentifier;
    declare @Quantity decimal(18, 2);
    declare @ProductType int;

    SELECT TOP(1) @OrganizationId = OrganizationId, @DocumentId = A.Id, @Date = A.[Date], @TermDate = A.TermDate, @DespatchDate = A.DespatchDate, @DespatchNo = A.DespatchNo,
    @WarehouseId = A.WarehouseId, @CustomerId = A.CustomerId, @GrandTotal = A.GrandTotal,
    @WhoCreated = A.WhoCreated, @DateCreated = A.DateCreated, @WhoUpdated = A.WhoUpdated, @DateUpdated = A.DateUpdated
    FROM TBLDebitInvoices AS A
    INNER JOIN inserted AS B ON A.Id = B.InvoiceId

    /* CHECK STOCK TRANSACTION */
    SELECT @cnt = COUNT(*) FROM inserted AS A
    INNER JOIN TBLProducts AS B ON B.Id = A.ProductId
    WHERE B.ProductType != 1

    --we have products for stock, create stock header
    IF(@cnt > 0)
    BEGIN
        INSERT INTO TBLStocks (OrganizationId, TransactionType, DocumentType, DocumentId, [Date], DeliveryDate, DeliveryNo, SourceWarehouseId, CustomerId, [Description], WhoCreated, DateCreated, WhoUpdated, DateUpdated, IsDeleted)
        VALUES (@OrganizationId, 5, 0, @DocumentId, @Date, @DespatchDate, @DespatchNo, @WarehouseId, @CustomerId, '', @WhoCreated, @DateCreated, @WhoUpdated, @DateUpdated, 0);

        SELECT @StockId = ???????;
    END

    INSERT INTO TBLStockDetails (StockId, ProductId, [Value])
    SELECT @StockId, ProductId, SUM(Quantity) FROM (
        SELECT A.ProductId AS ProductId, A.Quantity  FROM inserted AS A
        INNER JOIN TBLProducts AS B ON B.Id = A.ProductId
        WHERE B.ProductType = 0
        UNION ALL
        SELECT C.IngredientID, A.Quantity * C.Quantity FROM inserted AS A
        INNER JOIN TBLProducts AS B ON B.Id = A.ProductId
        INNER JOIN TBLProductRecipes AS C ON C.ProductId = B.Id
        WHERE B.ProductType = 2
    ) AS T1
    GROUP BY ProductId;

    UPDATE TBLDebitInvoices SET StockId = @StockId WHERE Id = @DocumentId;

    /* CHECK DC TRANSACTION */
    INSERT INTO TBLDebitCreditTransactions (TransactionType, DocumentType, DocumentId, PaymentStatus, [Date], Amount, AccountType, AccountId, CurrencyTypeId)
    VALUES (1, 0, @DocumentId, 0, @TermDate, @GrandTotal, 0, @CustomerId, @CurrencyTypeId);
END
GO

在这个触发器中我有这个插入:

INSERT INTO TBLStocks (OrganizationId, TransactionType, DocumentType, DocumentId, [Date], DeliveryDate, DeliveryNo, SourceWarehouseId, CustomerId, [Description], WhoCreated, DateCreated, WhoUpdated, DateUpdated, IsDeleted)
VALUES (@OrganizationId, 5, 0, @DocumentId, @Date, @DespatchDate, @DespatchNo, @WarehouseId, @CustomerId, '', @WhoCreated, @DateCreated, @WhoUpdated, @DateUpdated, 0);

SELECT @StockId = ???????;

并且我需要将 ID 插入到此 table 以便我可以使用它的 ID 来插入它的行元素。

看来我找到了答案,我不确定插入的语句是否会为第二个插入提供单独的结果,但它有效

DECLARE @IdTable TABLE (StockId uniqueidentifier);

INSERT INTO TBLStocks (OrganizationId, TransactionType, DocumentType, DocumentId, [Date], DeliveryDate, DeliveryNo, SourceWarehouseId, CustomerId, [Description], WhoCreated, DateCreated, WhoUpdated, DateUpdated, IsDeleted)
    OUTPUT Inserted.Id INTO @IdTable(StockId)
    SELECT @OrganizationId, 5, 0, @DocumentId, @Date, @DespatchDate, @DespatchNo, @WarehouseId, @CustomerId, '', @WhoCreated, @DateCreated, @WhoUpdated, @DateUpdated, 0;

    SELECT @StockId = StockId FROM @IdTable;

这会给第二个 table 插入的唯一标识符