合并以在 SQL 服务器数据库中插入或更新记录

Merge to Insert or update records in SQL Server database

我很难使用 BizTalk 创建一个存储过程来 insert/update 从 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" with URL "mssql://abc//def?". It will be retransmitted after the retry interval specified for this Send Port. Details:"System.Data.SqlClient.SqlException (0x80131904): Procedure or function 'uspInsertorUpdateINF' expects parameter '@dp_id', which was not supplied

我正在使用 BizTalk 映射将 Oracle 数据库中的值映射到 SQL 服务器存储过程

我不确定为什么会出现此错误。

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

  1. Group Hub 选项卡,查询暂停实例,查看暂停实例的消息,查找 dp_id 节点的值
  2. 为处理此消息的端口/编排打开消息跟踪,并查看跟踪的消息事件;这也会向您显示成功的消息(如果有的话),并且可能会为您提供源消息。
  3. 使用 SQL Server Profiler 检查实际过程调用,并检查作为 @dp_id 传递的参数值。如果您在 XML.
  4. 中没有看到关于 HOME_AU/dp_id 的任何异常,这可用于诊断问题

您最可能的原因是源数据对于正在生成的内容具有 null 或空值 HOME_AU。如果是这种情况,您可以指定 @dp_id char(30) = NULL,或者您希望它在存储过程定义中具有的任何默认值。

此外,仅供参考 - 在 BizTalk 的存储过程中使用 Table 值参数通常会获得更好的性能(和更大的灵活性)。特别是因为,在这种情况下,无论如何,您都在尝试从过程中的参数(使用 VALUES 子句)构建 table。