Ejemplo de fusión T SQL necesario para ayudar a la comprensión

El seguimiento:

MERGE dbo.commissions_history AS target USING (SELECT @amount, @requestID) AS source (amount, request) ON (target.request = source.request) WHEN MATCHED THEN UPDATE SET amount = source.amount WHEN NOT MATCHED THEN INSERT (request, amount) VALUES (source.request, source.amount); 

desde https://stackoverflow.com/a/2967983/857994 es una forma bastante ingeniosa de insertar / actualizar (y eliminar con algún trabajo adicional). Me resulta difícil seguir aunque incluso después de googlear.

Alguien puede por favor

  • explique esto un poco en términos simples: la documentación de MSDN mutiló mi cerebro en este caso.
  • mostrarme cómo se podría modificar para que el usuario pueda escribir los valores para la cantidad y la solicitud en lugar de tenerlos seleccionados de otra ubicación de base de datos.

Básicamente, me gustaría utilizar esto para insertar / actualizar desde una aplicación C # con información tomada de los archivos XML que obtengo. Entonces, necesito entender cómo puedo formular una consulta manualmente para obtener mis datos analizados en la base de datos con este mecanismo.

Si no está familiarizado con las instrucciones join, entonces es allí donde debe comenzar. Comprender cómo funcionan las uniones es clave para el rest. Una vez que esté familiarizado con las uniones, entender la fusión es más fácil al considerarla una combinación completa con instrucciones sobre qué hacer para las filas que coinciden o no coinciden.

Entonces, usando el ejemplo de código proporcionado, veamos la tabla comisiones_historia

 | Amount | Request |  | -------------------------------------------- | 12.00 | 1234 |  | | 14.00 | 1235 |  | | 15.00 | 1236 |  | 

La statement de combinación crea una unión completa entre una tabla, llamada “destino” y una expresión que devuelve una tabla (o un conjunto de resultados que es lógicamente muy similar a una tabla como un CTE) llamada “fuente”.

En el ejemplo dado, está usando variables como la fuente que supondremos ha sido establecida por el usuario o pasada como parámetro.

 DECLARE @Amount Decimal = 18.00; DECLARE @Request Int = 1234; MERGE dbo.commissions_history AS target USING (SELECT @amount, @requestID) AS source (amount, request) ON (target.request = source.request) 

Crea el siguiente conjunto de resultados cuando se lo considera una unión.

 | Amount | Request |  | Source.Amount | Source.Request | ------------------------------------------------------------------------------ | 12.00 | 1234 |  | 18.00 | 1234 | | 14.00 | 1235 |  | null | null | | 15.00 | 1236 |  | null | null | 

Usando las instrucciones dadas sobre qué hacer con el objective con la condición de que se encuentre una coincidencia.

 WHEN MATCHED THEN UPDATE SET amount = source.amount 

La tabla objective resultante ahora se ve así. La fila con la solicitud 1234 se actualiza para que sea 18.

 | Amount | Request |  | -------------------------------------------- | 18.00 | 1234 |  | | 14.00 | 1235 |  | | 15.00 | 1236 |  | 

Desde que se encontró un partido, no sucede nada más. Pero digamos que los valores de la fuente fueron así.

 DECLARE @Amount Decimal = 18.00; DECLARE @Request Int = 1239; 

La unión resultante se vería así:

 | Amount | Request |  | Source.Amount | Source.Request | ------------------------------------------------------------------------------ | 12.00 | 1234 |  | null | null | | 14.00 | 1235 |  | null | null | | 15.00 | 1236 |  | null | null | | null | null | null | 18.00 | 1239 | 

Como no se encontró una fila coincidente en el destino, la instrucción ejecuta la otra cláusula.

 WHEN NOT MATCHED THEN INSERT (request, amount) VALUES (source.request, source.amount); 

Resultando en una tabla de objectives que ahora se ve así:

 | Amount | Request |  | -------------------------------------------- | 12.00 | 1234 |  | | 14.00 | 1235 |  | | 15.00 | 1236 |  | | 18.00 | 1239 |  | 

El verdadero potencial de las declaraciones de combinación es cuando la fuente y el objective son tablas grandes. Como puede hacer una gran cantidad de actualizaciones y / o insertos para cada fila con una sola statement simple.

Una nota final. Es importante tener en cuenta que not matched valores predeterminados not matched con la cláusula completa que not matched by target , sin embargo, puede especificar que not matched by source en lugar de, o además de, la cláusula predeterminada. La instrucción de fusión admite ambos tipos de discrepancias (registros en el origen que no está en el destino o registros en el destino que no están en el origen , tal como se define en la cláusula on ). Puede encontrar la documentación completa, las restricciones y la syntax completa en MSDN.

En el ejemplo de respuesta dado que has hecho

 DECLARE @Request Int 

, pero llamándolo en el SQL de la siguiente manera:

 SELECT @amount, @requestID 

Otro sería nombrar y llamar a las variables de manera idéntica:

 @amount vs. Amount -> @Amount & Amount 
    Intereting Posts