he ' heredada' una brillante pieza de código TSQL que hace esto:TSQL Complejo Merge
- Loops fila por fila sobre un cursor.
- El cursor contiene datos que deben fusionarse (Upserted) en la Tabla A
- Para cada ciclo de fila en el cursor se llama a un proceso almacenado. El proc:
- Si existe una fila correspondiente en la tabla A a continuación, se actualiza
- Si una fila tal no existe, entonces:
- inserta una sola fila en en una tabla diferente B.
- de obtenciones el ID recién generado (digamos su IDB llamado)
- Inserta una sola fila en la Tabla A. Las inserciones en la Tabla A necesitan un IDB (el campo no es nulo, se supone que tiene valores SÓLO de la tabla B, pero no FK) restricción está en su lugar)
Obviamente esto es una mierda (razones de rendimiento & elegancia) !!
Pregunta Al principio esto parece un caso estándar de uso de MERGE. Intenté hacer:
MERGE [dbo].[TableA] AS Target
USING <cursor data set as a select statement> as Src on target.IDA = Src.IDA
WHEN MATCHED
//update
WHEN NOT MATCHED
//insert <------ Fails because obviously a new IDB is required
intentado también diversos enfoques como un nested select that sends IDB on the OUTPUT
pero falla porque BID es una PK.
Otros tipos de fusiones también fracasaron por ejemplo:
MERGE Table A with <cursor data set as a select statement>
...
MERGE Table A with Table B
WHEN NOT MATCHED
//insert on Table A
WHEN NOT MATCHED
// Update Table B
¿Alguien tiene una idea sobre esto? Esencialmente Creo que si se generaliza la pregunta sería:
Can I insert and return the PK in one statement that can be nested in other statements
Gracias de antemano por cualquier respuesta
George
Usted puede fundirse en la Tabla B y utilice los botones [técnica aquí] (http://stackoverflow.com/q/5365629/73226) creo. –
Gracias, lo vi. Es realmente una buena idea. Básicamente, el chico almacena Ids generados recientemente en variables temporales. No es lo mismo que lo que estaba buscando (hacer todo el proceso en 1 Merge) pero sigue siendo un enfoque interesante. Gracias Martin. – George
+1 por usar la palabra 'upserted' ... :) –