簡體   English   中英

如何使用SQL Server的OUTPUT子句進行更新

[英]How to use OUTPUT clause of SQL Server for update

DECLARE @t2 AS TABLE(id INT)  

INSERT INTO dbo.EntityMaster
        (EntityType)
OUTPUT INSERTED.EntityId INTO @t2
SELECT 'G' FROM #tmp

#tmp是一個臨時表,包含從xml加載的數據。 我需要為#tmp包含的每條記錄生成EntityId 可以先將記錄插入到EntityMaster表中,然后將此實體代碼插入到每個記錄的#tmp中。

我沒有將記錄插入@t2 ,而是需要為每條記錄更新#tmp

有可能嗎?

嘗試像這樣的東西,你仍然需要使用臨時表,但它不是太糟糕的閱讀,它完成工作。

CREATE TABLE #tmp
(
    tmpID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    xmlData VARCHAR(255),
    EntityId INT
)
DECLARE @t2 TABLE
(
    tmpID INT,
    EntityId INT
)

MERGE dbo.EntityMaster AS EM
USING
(
    SELECT tmpID,
        xmlData,
        EntityId
    FROM #tmp
) AS X
    ON EM.EntityId = X.EntityId
WHEN NOT MATCHED THEN
    INSERT (EntityType)
    VALUES (X.xmlData)
OUTPUT X.tmpID, INSERTED.EntityId
INTO @t2 (tmpID, EntityId);

UPDATE T
SET EntityId = T2.EntityId
FROM @t2 T2
INNER JOIN #tmp T
    ON T2.tmpID = T.tmpID

在將XML記錄插入#tmp表的SQL中,這將更容易實現。

考慮以下@recs表,可以將其視為從XML生成的一組記錄:

declare @recs table (val varchar(255))
insert into @recs values ('this'), ('is'), ('a'), ('test')

您可以輕松地為每條記錄添加遞增整數,如下所示:

select row_number() over (order by (select 1)) as id, val from @recs

結果如下:

id  val
1   this
2   is
3   a
4   test

您可以使用row_number() over (order by (select1))來生成在將記錄插入#tmp的同時需要的ID嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM