Хранимая процедура для обновления или вставки

Я новичок в хранимой процедуре, и мне удалось погуглить, чтобы создать хранимую процедуру для вставки или обновления базы данных. Набор записей выбирается из базы данных Oracle, и в зависимости от em_id он должен быть вставлен или обновлен в таблицу базы данных Sql с помощью BizTalk. Попытка создать хранимую процедуру для вставки или обновления записей в зависимости от поля.

CREATE PROCEDURE [dbo].[usp_InsertorUpdateDB]
 @dp_id                char(32),
 @dv_id                char(32),
 @em_number            char(12),
 @email                varchar(50),
 @emergency_relation   char(32),
 @option1              char(16),
 @status               char(20),
 @em_id                char(35),
 @em_title             varchar(64),
 @date_hired           datetime

 AS

 MERGE [dbo].[em] AS [Target]
 USING (SELECT @dp_id, @dv_id , @em_number, @email, @emergency_relation, @option1, @status, @em_id, @em_title, @date_hired)
 AS [Source] ([dp_id], [dv_id], [em_number], [email], [emergency_relation], [option1], [status], [em_id], [em_title], [date_hired])  

 ON [Target].[em_id] = [Source].[em_id]

 WHEN MATCHED THEN
 UPDATE SET [dp_id]                 = [Source].[dp_id],
            [dv_id]                 = [Source].[dv_id],
            [em_number]             = [Source].[em_number],
            [email]                 = [Source].[email],
            [emergency_relation]    = [Source].[emergency_relation],
            [option1]               = [Source].[option1],
            [status]                = [Source].[status],
            [em_id]                 = [Source].[em_id],
            [em_title]              = [Source].[em_title],
            [date_hired]            = [Source].[date_hired]

WHEN NOT MATCHED THEN

INSERT ([dp_id], [dv_id], [em_number], [email], [emergency_relation], [option1], [status], [em_id], [em_title],[date_hired])
VALUES ([Source].[dp_id], [Source].[dv_id], [Source].[em_number], [Source].[email], [Source].[emergency_relation], [Source].[option1], [Source].[status], [Source].[em_id], [Source].[em_title], [Source].[date_hired]);
GO

Я задал вопрос за два дня до этого, потому что он показывал

Неправильный синтаксис рядом с ключевым словом «КОГДА».

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


person xyz    schedule 06.04.2015    source источник
comment
Да, MERGE потенциально подвержен взаимоблокировкам. Вам нужно использовать традиционную версию. Сначала вы делаете обновление. Если @@ROWCOUNT = 0, вы выполняете вставку.   -  person Sean Lange    schedule 06.04.2015
comment
Я выбираю записи из базы данных Oracle и вставляю их в таблицу базы данных Sql с помощью BizTalk. Здесь работает @@ROWCOUNT?   -  person xyz    schedule 07.04.2015
comment
да. Rowcount просто возвращает количество строк, затронутых последним оператором.   -  person Sean Lange    schedule 07.04.2015
comment
Вам также следует подумать о рефакторинге вашего SP, чтобы использовать параметр с табличным значением, тем более что вы все равно хотите обрабатывать эти данные как табличные.   -  person Dan Field    schedule 07.04.2015


Ответы (1)


Слияние является причиной тупика, вы можете просто попробовать это

        CREATE PROCEDURE [dbo].[usp_InsertorUpdateDB]
     @dp_id                char(32),
     @dv_id                char(32),
     @em_number            char(12),
     @email                varchar(50),
     @emergency_relation   char(32),
     @option1              char(16),
     @status               char(20),
     @em_id                char(35),
     @em_title             varchar(64),
     @date_hired           datetime

     AS

     IF ( (SELECT COUNT(em_id) FROM [dbo].[em] WHERE em_id = @em_id) > 0)
      UPDATE [dbo].[em] 
      SET 
                [dp_id]                 = @dp_id,
                [dv_id]                 = @dv_id,
                [em_number]             = @em_number,
                [email]                 = @email,
                [emergency_relation]    = @emergency_relation,
                [option1]               = @option1,
                [status]                = @status,
                [em_id]                 = @em_id,
                [em_title]              = @em_title,
                [date_hired]            = @date_hired
WHERE em_id = @em_id

    ELSE

    INSERT INTO [dbo].[em] (dp_id, dv_id, em_number, email, emergency_relation, option1, [status], em_id, em_title,date_hired)
    VALUES (@dp_id, @dv_id, @em_number, @email, @emergency_relation, @option1, @status, @em_id, @em_title, @date_hired);
    GO
person Yasser El-Ekhnawy    schedule 14.05.2015