2012-09-13 22 views
7
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表中,然後將該實體ID插回到每個記錄的#tmp中。如何使用SQL Server的OUTPUT子句更新

代替插入記錄到@t2,我需要爲每條記錄更新#tmp

有什麼可能嗎?

+0

你會在#tmp中標識哪個記錄與哪個entityid一起? – HLGEM

+0

@HLGEM:我在想同樣的事情,但我有一個想法,在EntityMaster專欄中使用GUID字段,該專欄將由前端生成並且始終是唯一的。使用這個,我可以將EntityMaster –

回答

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 

+0

的每條記錄關聯好!我喜歡你的答案;) –

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))生成您需要的ID,同時將記錄插入#tmp