2015-04-06 84 views
0

我是新来的存储过程,并管理谷歌,创建一个存储过程插入或更新数据库。从Oracle数据库中选择一组记录,并根据使用BizTalk将它更新或更新到Sql数据库表中的em_id 尝试创建存储过程以根据字段插入或更新记录。存储过程更新或插入

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 

我问一个问题前两天,因为它显示了关键字“何时”近

不正确的语法。

有一个评论显示代码很容易出现死锁。由于我是新的存储过程,我不知道如何创建存储过程插入或更新没有死锁。我真的卡住了。

+0

是在合并可能容易出现死锁。您需要使用传统版本。首先你做一个更新。如果@@ ROWCOUNT = 0,则执行插入操作。 –

+0

我从Oracle数据库中选择记录并使用BizTalk将其插入到Sql数据库表中。 @@ ROWCOUNT在这里工作吗? – xyz

+0

是的。 Rowcount只是返回最后一条语句影响的行数。 –

回答

0

合并是死锁的原因,你可以简单地尝试

 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