2013-09-18 3 views
16

Я пытаюсь обновить записи, используя SP в одну таблицу.Fast upsert Sql server 2008 R2

CREATE TABLE [dbo].[SHARE_AD_GROUP](
    [SHARE_AD_GROUP_ID] [int] IDENTITY(1,1) NOT NULL, 
    [SHARE_ID] [int] NOT NULL, 
    [AD_GROUP] [varchar](200) NOT NULL, 
    [SHARE_PERMISSIONS] [varchar](65) NULL, 

, что это лучший способ следующее:

1-

ALTER PROCEDURE [dbo].[PROC_INSERT_SHARE_AD_GROUP] 


@shareID int, 
@ownerId varchar(200), 
@sharePermissions varchar(65) 

AS 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    UPDATE [dbo].SHARE_AD_GROUP 
       SET 
        [SHARE_PERMISSIONS] = @sharePermissions 
      WHERE SHARE_ID = @shareID and [AD_GROUP] = @ownerId 
    if @@ROWCOUNT =0 
    begin 
    INSERT INTO [dbo].SHARE_AD_GROUP 
         (SHARE_ID,[AD_GROUP],[SHARE_PERMISSIONS]) 
       VALUES 
         (@shareID,@ownerId,@sharePermissions) 
    end 

end 

2-

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 

    declare @id int 
    SET NOCOUNT ON; 
    set @id = (select top 1 SHARE_AD_GROUP_ID from SHARE_AD_GROUP where SHARE_ID = @shareID and [AD_GROUP] = @ownerId) 
     if @id is null 
      begin 
       INSERT INTO [dbo].SHARE_AD_GROUP 
         (SHARE_ID,[AD_GROUP],[SHARE_PERMISSIONS]) 
       VALUES 
         (@shareID,@ownerId,@sharePermissions) 
       set @id = SCOPE_IDENTITY() 
      end 
     else 
      begin 
      UPDATE [dbo].SHARE_AD_GROUP 
       SET 
        [SHARE_PERMISSIONS] = @sharePermissions 
      WHERE SHARE_ID = @shareID and [AD_GROUP] = @ownerId 
      end 
End 

3- Merge не ==> Понятия не имею, как писать, что ,

Каков самый быстрый способ, на ваш взгляд?

+2

возможно дубликат [Решения для вставки или обновления на SQL Server] (http://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server) –

ответ

5

Я уверен, что вы уже это поняли. Но кто-то может найти это полезным.

ALTER PROCEDURE [dbo].[PROC_INSERT_SHARE_AD_GROUP] 
    @shareID int, 
    @ownerId varchar(200), 
    @sharePermissions varchar(65) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    MERGE [dbo].SHARE_AD_GROUP AS T 
    USING 
    (
     SELECT @shareID,@ownerId,@sharePermissions 
    ) AS S 
    (
     SELECT Share_ID,AD_Group,Share_Permissions 
    ) 
    ON (T.SHARE_ID = S.Share_ID and T.AD_GROUP = S.AD_Group) 

    WHEN MATCHED THEN 
     UPDATE SET SHARE_PERMISSIONS = S.Share_Permissions 

    WHEN NOT MATCHED THEN 
     INSERT 
      (SHARE_ID,AD_GROUP,SHARE_PERMISSIONS) 
     VALUES 
      (S.Share_ID,S.AD_Group,S.Share_Permissions) 
    ; 
END 
11

Я думаю, что заявление о слиянии быстрее, чем то, что вы демонстрируете двумя способами. если вы хотите узнать больше о том, как писать сливаться в Query в SQL сервере, то, пожалуйста, перейдите по ссылке ..

http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction-to-merge-statement-one-statement-for-insert-update-delete/

https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/

и ваш блок слияния выглядит так, что вам нужно положить, что в вашем магазине или в других местах.

MERGE INTO SHARE_AD_GROUP A 
USING (
    SELECT SHARE_AD_GROUP_ID, 
     SHARE_ID, 
     AD_GROUP, 
     SHARE_PERMISSIONS 
    FROM SHARE_AD_GROUP 
    WHERE SHARE_ID = @shareID AND AD_GROUP = @ownerId 
) B ON (A.SHARE_AD_GROUP_ID = B.SHARE_AD_GROUP_ID) 
WHEN MATCHED THEN 
    UPDATE SET A.SHARE_PERMISSIONS = B.SHARE_PERMISSIONS 
WHEN NOT MATCHED THEN 
    INSERT (SHARE_PERMISSIONS) VALUES(@sharePermissions); 
+0

Все примеры используют 2 таблицы target и source, но в моем случае я передаю параметры SP. я искал, но не смог найти аналогичный случай. – Maro

+0

Я обновил свой ответ, вы можете посмотреть и внести соответствующие изменения в соответствии с вашими требованиями. –

Смежные вопросы