2012-09-13 9 views
7
DECLARE @t2 AS TABLE(id INT) 

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

#tmp to tymczasowa tabela zawierająca dane załadowane z xml. Muszę wygenerować EntityId dla każdego rekordu zawartego w #tmp. Można to zrobić, wstawiając rekord najpierw do tabeli EntityMaster, a następnie wstawiając ten entityid z powrotem do #tmp dla każdego rekordu.Sposób korzystania z klauzuli OUTPUT programu SQL Server do aktualizacji

Zamiast wstawiania rekordu do @t2, należy zaktualizować #tmp dla każdego rekordu.

Każda możliwość?

+0

Czy byłbyś w stanie zidentyfikować, który rekord w #tmp pasuje do którego entityid? – HLGEM

+0

@HLGEM: Myślałem o tym samym, ale mam pomysł, aby wziąć pole GUID w kolumnie EntityMaster, które zostanie wygenerowane przez frontend i zawsze będzie unikalne. Dzięki temu mogę powiązać każdą płytę z EntityMaster –

Odpowiedz

1

Spróbuj czegoś takiego, nadal musisz korzystać z tabeli tymczasowej, ale nie jest tak źle, aby przeczytać i robi to zadanie.

 
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

ładnie! Podoba mi się twoja odpowiedź;) –

0

Byłoby to łatwiejsze do wykonania w SQL, który wstawia rekordy XML do tabeli #tmp.

Rozważmy następujący @recs tabeli, które mogłyby być traktowane jako zbiór dokumentacji wytworzonej z XML:

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

Można łatwo dodać wzrastających całkowitą do każdego rekordu tak:

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

Wynik wygląda następująco:

id val 
1 this 
2 is 
3 a 
4 test 

Czy możesz użyć row_number() over (order by (select1)) do generowania identyfikatorów, których potrzebujesz, w tym samym czasie, gdy rekordy są wstawiane do #tmp?

Powiązane problemy