No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Distintas opciones de utilizar Merge

12/31
Recursos

Aportes 7

Preguntas 2

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Como dato a los que les interese, para que no le salgan tantos subrayados en rojo en el script (y esto pasa porque SQL no reconoce que una columna, una tabla, procedimiento, vista y otros, existe o se ha creado), es porque toca actualizar la cach茅 local del SQL. Lo pueden hacer en en men煤 Editar > IntelliSense > Actualizar cach茅 local. O pueden presionar las teclas Ctrl + Mayus. + R

Tambien se puede utilizar Table Type para enviar directamente la cantidad que se necesite de registros a actualizar con el Merge, siguiendo el ejemplo mostrado seria solo sustituir algunas lineas de codigosL

CREATE TABLE UsuarioTarget
(
Codigo INTEGER,
Nombre VARCHAR(100),
Puntos INTEGER
);

CREATE TYPE TEST AS TABLE
(
Codigo INTEGER,
Nombre VARCHAR(100),
Puntos INTEGER
);

DECLARE @TEST TEST;
INSERT INTO @TEST VALUES(1, 鈥楧AVID鈥, 100), (2, 鈥楯UAN鈥, 60);
SELECT * FROM @TEST
SELECT * FROM UsuarioTarget;

EXEC MerceUsuarioTarget @TEST
SELECT * FROM UsuarioTarget;

CREATE PROCEDURE MerceUsuarioTarget
@TEST TEST READONLY
AS
BEGIN
MERGE UsuarioTarget AS T
USING @TEST AS S
ON (T.Codigo = S.Codigo)
WHEN MATCHED THEN
UPDATE SET T.Nombre = S.Nombre,
T.Puntos = S.Puntos
WHEN NOT MATCHED THEN
INSERT (Codigo, Nombre, Puntos)
VALUES (S.Codigo, S.Nombre, S.Puntos) ;
END

Utilizando Table Type se puede enviar mas informaci贸n hacia el SP creado, me funciona cuando tengo que enviar gran cantidad de informaci贸n en una sola conexion, para no realizar una conexion por cada registro de una Tabla.

Tambi茅n creo que podr铆a realizarse as铆, dandole el alias dentro del select en el using

CREATE PROCEDURE MergeUsuarioTarget
@codigo integer,
@nombre varchar(100),
@puntos integer
AS
BEGIN
	
	MERGE UsuarioTarget T
	USING (SELECT @codigo CODIGO,@nombre NOMBRE,@puntos PUNTOS) AS S
		ON (T.CODIGO = S.CODIGO)
	WHEN MATCHED THEN
		UPDATE SET T.NOMBRE = S.NOMBRE,
				   T.PUNTOS = S.PUNTOS
	WHEN NOT MATCHED THEN
		INSERT (CODIGO,NOMBRE,PUNTOS)
		VALUES (S.CODIGO,S.NOMBRE,S.PUNTOS);
END

Investigando un poco sobre los MERGE y sus uso, encontr茅 un blog referente al autor del curso que explica estos ejemplos:

Merge en SQL

Entendido

Una manera de verificar si un Procedure existe, y en la parte final de la practica el SP invocado no concuerda con el SP creado.

USE AdventureWorks2019

BEGIN TRANSACTION
ROLLBACK

IF (OBJECT_ID(鈥榮p_ActualizaInventario鈥) IS NOT NULL)
DROP PROCEDURE sp_ActualizaInventario
GO

SELECT * FROM Production.ProductInventory WHERE ProductID = 707

go

CREATE OR ALTER PROCEDURE msp_ActualizaInventario
@OrderDate datetime
AS
MERGE Production.ProductInventory AS target
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = @OrderDate
GROUP BY ProductID) AS source (ProductID, OrderQty)
ON (target.ProductID = source.ProductID)
WHEN MATCHED AND target.Quantity - source.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty,
target.ModifiedDate = GETDATE()

OUTPUT $action,source.ProductID, source.OrderQty,
Inserted.ProductID, Inserted.Quantity,
Inserted.ModifiedDate, Deleted.ProductID,
Deleted.Quantity, Deleted.ModifiedDate;
GO

select * from Production.ProductInventory WHERE ProductID = 707
select * from Production.ProductInventory WHERE ProductID = 747

EXECUTE msp_ActualizaInventario 鈥2011-05-31 00:00:00.000鈥

select * from Production.ProductInventory WHERE ProductID = 707
select * from Production.ProductInventory WHERE ProductID = 747

Si van a borrar un sp antes tratar de buscar si existe con la siguiente sentencia (y tambi茅n manejar sps con _ no con . Porque es m谩s dif铆cil a la hora de buscarlos)

<code> 
Borrar el sp si ya existe
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.Production_msp_UpdateInventory'))
   DROP PROCEDURE Production_msp_UpdateInventory
GO