合并以插入或更新SQL Server数据库中的记录

时间:2015-04-15 11:38:17

标签: sql-server stored-procedures biztalk

我很难创建存储过程,使用BizTalk将所选记录从Oracle数据库插入/更新到SQL Server数据库。

ALTER PROCEDURE [dbo].[uspInsertorUpdateINF]
    @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
BEGIN
   SET NOCOUNT ON;

   MERGE [dbo].[em] AS [Targ]
   USING (VALUES (@dp_id, @dv_id , @em_number, @email, @emergency_relation, @option1, @status, @em_id, @em_title, @date_hired))
   AS [Sourc] (dp_id, dv_id, em_number, email, emergency_relation, option1, status, em_id, em_title, date_hired)  
      ON [Targ].em_id = [Sourc].em_id

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

   WHEN NOT MATCHED BY TARGET THEN
      INSERT (dp_id, dv_id, em_number, email, emergency_relation, option1, status, em_id, em_title,date_hired)
      VALUES ([Sourc].dp_id, [Sourc].dv_id, [Sourc].em_number, [Sourc].email, [Sourc].emergency_relation, [Sourc].option1, [Sourc].status, [Sourc].em_id, [Sourc].em_title, [Sourc].date_hired);

 END;

我收到错误:

  

WcfSendPort_SqlAdapterBinding_TypedProcedures_dbo_Custom"使用URL" mssql:// abc // def?"。它将在为此发送端口指定的重试间隔后重新传输。详细信息:" System.Data.SqlClient.SqlException(0x80131904):过程或函数' uspInsertorUpdateINF'期望参数' @ dp_id',未提供

我正在使用BizTalk映射将值从Oracle DB映射到SQL Server存储过程

enter image description here

我不确定为什么会收到此错误。

1 个答案:

答案 0 :(得分:2)

该过程未获取@dp_id参数。最可能的原因是源消息中的HOME_AU为空/零。您可以通过以下几种方式进行检查:

  1. Group Hub选项卡,查询Suspended Instances,检查被挂起的实例的消息,查找dp_id节点的值
  2. 打开处理此消息的端口/业务流程的消息跟踪,并查看“跟踪消息事件”;这会向你显示成功的消息(如果有的话),并且可能会给你消息来源。
  3. 使用SQL Server Profiler检查实际的过程调用,并检查作为@dp_id传递的参数的值。如果您没有在XML中看到有关HOME_AU / dp_id的任何异常,则可以使用此方法来诊断问题。
  4. 您最可能的原因是源数据对于产生HOME_AU的任何内容具有空值或空值。如果是这种情况,您可以指定@dp_id char(30) = NULL,或者您希望它在存储过程定义中具有的任何默认值。

    另外,仅供参考 - 在BizTalk的存储过程中使用表值参数通常会获得更好的性能(以及更大的灵活性)。特别是因为在这种情况下,你试图在你的程序中用参数(使用VALUES子句)构建一个表。