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

时间:2012-09-13 20:15:29

标签: sql sql-server-2008

DECLARE @t2 AS TABLE(id INT)  

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

#tmp是一个临时表,包含从xml加载的数据。我需要为EntityId中包含的每条记录生成#tmp。可以先将记录插入EntityMaster表,然后将此实体代码插回每个记录的#tmp

我需要为每条记录更新@t2,而不是将记录插入#tmp

有可能吗?

2 个答案:

答案 0 :(得分:1)

尝试类似这样的东西,你仍然需要使用临时表,但它不是太糟糕,无法阅读并完成工作。

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

答案 1 :(得分:0)

在将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?