2012-01-02 26 views
10

Estoy buscando algunos consejos sobre cómo optimizar los procedimientos almacenados par sql. Con la primera consulta estoy insertando, y con la segunda estoy haciendo una actualización, si los datos existen. Lo que quiero hacer es fusionar ambos procedimientos almacenados en uno, donde la consulta verificará si existen los datos que actualizar, de lo contrario inserte una nueva fila. Aquí es lo que tengo en este momento:upsert sql query

actualización de SP:

ALTER PROCEDURE [dbo].[UpdateStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50), 
          @TitlePosition nvarchar(30))             
AS 
BEGIN 
UPDATE Company_Information 
SET First_Name = @First_Name, 
    Last_Name = @Last_Name, 
    [email protected], 
    WHERE UserId = @UserId 
    END 

inserto SP:

ALTER PROCEDURE [dbo].[InsertStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50), 
          @TitlePosition nvarchar(30)) 

AS 
BEGIN 
    INSERT INTO Company_Information(UserId, 
            First_Name, 
            Last_Name, 
            Title_Position) 

            VALUES 
            (@UserId, 
            @First_Name, 
            @Last_Name, 
            @TitlePosition) 
END 

Por lo tanto, me gustaría combinar ambas SP en uno, y el SP a compruebe si ya hay datos para ese UserId que actualización, de lo contrario inserte una nueva fila. ¿Puede alguien ayudarme con esto? Gracias y felices fiestas a todos, Laziale

Respuesta

18

MERGE Statement?

CREATE PROCEDURE [dbo].[MERGEStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50), @TitlePosition nvarchar(30))             
AS 
BEGIN 
MERGE Company_Information WITH(HOLDLOCK) AS T 
USING(SELECT 1 S) S 
ON T.UserId = @UserId 
WHEN MATCHED THEN UPDATE SET 
    First_Name = @First_Name, 
    Last_Name = @Last_Name, 
    [email protected] 
WHEN NOT MATCHED THEN 
    INSERT (UserId, First_Name, Last_Name, Title_Position) 
    VALUES(@UserId, @First_Name,@Last_Name,@TitlePosition); 
END 
+4

1 [Puede ser que necesite 'HOLDLOCK' aunque] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) –

+0

@MartinSmith Sí , de acuerdo –

+0

Gracias por su ayuda. que funciona perfecto – Laziale

-1

siga estos pasos:

  1. crear una variable para probarlo (por ejemplo: @id)
  2. Seleccionar @id = UserId de Company_Information donde UserId = @ UserID
  3. If @id = @userId update; de ​​lo contrario, inserte

Como @gbn específicos, sean conscientes de concurrence issues.

+3

Esto no será concurrente seguro. Dos llamadas muy concurrentes pueden deducir que la fila aún no existe – gbn

+1

Ejemplo http://dba.stackexchange.com/a/9814/630 – gbn