[英]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.