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

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

#tmp es una tabla temporal que contiene datos cargados desde un xml. Necesito generar EntityId para cada registro contenido en #tmp. Puede hacerse insertando el registro primero en la tabla EntityMaster y luego inserte este entityid nuevamente en #tmp para cada registro.Cómo utilizar la cláusula OUTPUT de SQL Server para la actualización

En lugar de insertar el registro en @t2, necesito actualizar #tmp para cada registro.

¿Alguna posibilidad?

+0

¿Cómo identificarías qué registro en #tmp va con qué entityid? – HLGEM

+0

@HLGEM: Estaba pensando lo mismo, pero tengo una idea para tomar el campo GUID en la columna EntityMaster que se generará por interfaz y siempre será único. Usando esto, puedo asociar cada registro de EntityMaster –

Respuesta

1

Pruebe algo como esto, usted todavía tiene que usar la tabla temporal pero no es tan malo para leer y hace el trabajo.

 
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

¡agradable! Me gusta tu respuesta;) –

0

Esto sería más fácil de lograr en el SQL que inserta los registros XML en la tabla #tmp.

Considere el @recs siguiente tabla, que podría ser considerado como un conjunto de registros generados a partir de XML:

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

Usted puede agregar fácilmente un número entero cuyo valor aumenta para cada registro de la siguiente manera:

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

El resultado se ve así:

id val 
1 this 
2 is 
3 a 
4 test 

Podría usar row_number() over (order by (select1)) para generar los identificadores que necesita al mismo tiempo que los registros se insertan en #tmp?

Cuestiones relacionadas