【问题标题】:Merge to Insert or update records in SQL Server database合并以在 SQL Server 数据库中插入或更新记录
【发布时间】:2015-04-15 11:38:16
【问题描述】:

我很难创建一个存储过程来使用 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 存储过程

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

【问题讨论】:

  • 请检查源表中是否有任何记录具有空列 HOME_AU(映射到 sp 的 dp_id 参数)。
  • 在您决定使用 MERGE 之前,可能需要先看看这个。 mssqltips.com/sqlservertip/3074/…

标签: sql-server stored-procedures biztalk


【解决方案1】:

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

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

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

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

【讨论】:

  • 这确实有助于解决问题,Oracle DB 的 dp_id 值为 NULL,而在我们更改后它可以工作。但它只将一条记录从 Oracle 插入到 SQL DB。为什么不选择选择整个记录集进行插入或更新。
  • 为此,您需要传递一个表变量——它可能包含多行。您一次有效地传递了一行。
  • 如何传递表变量,我是 SQL 数据库查询和存储过程的新手。能不能详细解释一下。
  • 参见msdn.microsoft.com/en-us/library/bb510489.aspx - 然后为表值版本生成一个新模式。然后在重复节点上使用循环 functoid 在表参数中生成多行。
  • 我是否必须在 SQL 数据库中创建一个表。我不能在 Biztalk 端做任何事情吗?
猜你喜欢
  • 2020-11-21
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多