当从 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 插入的唯一标识符
我不确定如何打开标题,但让我解释一下我的问题是什么。
我有两个 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 插入的唯一标识符