2012-09-13 10 views
7

#tmp, xml'den yüklenen verileri içeren geçici bir tablodur. #tmp'da bulunan her kayıt için EntityId oluşturmam gerekiyor. İlk olarak EntityMaster tablosuna kayıt ekleyerek yapılabilir, daha sonra bu varlık için her kayıt için #tmp'a geri yerleştirin.Güncelleştirme için SQL Server'ın OUTPUT deyimi nasıl kullanılır

@t2'a kayıt eklemek yerine, her kayıt için #tmp'u güncellemem gerekiyor.

Herhangi bir ihtimal var mı?

+0

HOw hangi # tmp ile hangi kaydın nereye gittiğini tanımlar mı? – HLGEM

+0

@HLGEM: Ben de aynısını düşünüyordum ama ön uç tarafından oluşturulacak ve her zaman benzersiz olacak EntityMaster sütununda GUID alanı almanın bir fikri var. Bunu kullanarak, her kaydı EntityMaster –

cevap

1

Böyle bir şey yapmayı deneyin, yine de temp tablosunu kullanmak zorundasınız, ancak okumak çok kötü değil ve işi tamamlıyor.

 
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

'dan güzelleştirebilirim! Cevabını beğendim;) –

0

Bu, XML kayıtlarını #tmp tablosuna ekleyen SQL'de gerçekleştirmek daha kolay olurdu.

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

Kolayca böyle her kayıt için artan bir tamsayı ekleyebilirsiniz::

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

XML oluşturulan kayıtların bir kümesi olarak düşünülebilir aşağıdaki @recs tabloyu düşünün

Sonuç şöyle görünür:

id val 
1 this 
2 is 
3 a 
4 test 

Kullanabilir misiniz? row_number() over (order by (select1)) İhtiyacınız kimlikleri oluşturmak için aynı zamanda kayıtlar #tmp içine ekleniyor?

İlgili konular