2010-06-16 9 views
5

decir que tengo una tabla llamada Employee (tiene ID, NAME, ADDRESS y PHONE columnas). (No es mi problema real, pero simplificado para hacer la pregunta más fácil.)Cómo utilizar el comando de combinación

Si llamo a un procedimiento almacenado llamado UpdateEmployee y paso en un @Name, @Address, @Phone y @ID.

¿Puede combinarse para verificar fácilmente si la identificación existe? Si lo hace para actualizar el nombre, la dirección y el teléfono? y si no lo hace para insertarlos?

Veo ejemplos en la red, pero son enormes y peludos. Me gustaría un buen ejemplo simple si es posible.

(. Recientemente hemos actualizado a SQL 2008, por lo que soy nuevo en el comando de combinación)

Respuesta

7

El código de Bill Karwin es casi correcto. Hice los cambios necesarios. Jugar con los valores variables te permitirá verlo en acción. Tabla:

CREATE TABLE [dbo].[employee](
    [ID] [int] NULL, 
    [Name] [char](20) NULL, 
    [Address] [char](20) NULL, 
    [Phone] [int] NULL 
) ON [PRIMARY] 

Código:

DECLARE @ID int, @NAME char(20), @ADDRESS char(20), @PHONE int 
SET @ID=2 
SET @NAME='Jenny' 
SET @ADDRESS='11 My St' 
SET @PHONE=228326 

MERGE Employee AS target 
USING (SELECT @ID, @NAME, @ADDRESS, @PHONE) AS source (ID, Name, Address, Phone) 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET NAME = source.Name, 
      ADDRESS = source.Address, 
      PHONE = source.Phone 
WHEN NOT MATCHED THEN 
    INSERT (ID, NAME, ADDRESS, PHONE) 
    VALUES (source.ID, source.Name, source.Address, source.Phone); 
+1

+1 ¡Gracias por ponerlo a prueba! –

5

No he probado esto, pero en base a la docs esto puede conseguir que en el camino correcto:

MERGE myschema.Employee AS target 
USING (SELECT @ID, @NAME, @ADDRESS, @PHONE) AS source (ID, Name, Address, Phone) 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET NAME = source.Name 
      ADDRESS = source.Address 
      PHONE = source.Phone 
WHEN NOT MATCHED THEN 
    INSERT (ID, NAME, ADDRESS, PHONE) 
    VALUES (source.ID, source.Name, source.Address, source.Phone) 
+1

+1 Para hacer la mayoría del trabajo! – Kenneth

Cuestiones relacionadas