在BizTalk中使用存储过程插入/更新SQL Server表

3
我正在努力从Oracle数据库的视图中获取一组记录,并尝试根据BizTalk中的某个列将它们插入/更新到SQL Server表中。为此,我创建了一个存储过程:
Create PROCEDURE  [dbo].[uspInsertorUpdateDepartment]
    @dept_name varchar(64), 
    @jax_dept_id char(32)
AS
BEGIN  
    SET NOCOUNT ON;

    IF (SELECT TOP (1) 1 FROM afm.[jax_dept] 
        WHERE jax_dept_id = @jax_dept_id) IS NULL  
        INSERT INTO afm.[jax_dept](dept_name, jax_dept_id)   
        VALUES (@dept_name,@jax_dept_id)  
    ELSE
        UPDATE afm.[jax_dept] 
        SET dept_name = @dept_name   
        WHERE jax_dept_id = @jax_dept_id
END

我使用消费适配器服务创建了存储过程的模式。将它们用于映射和编排。但我无法在映射中使用循环功能块。

enter image description here

我已经删除了循环并部署了应用程序。尝试运行后,它可以正常运行,但只将Oracle视图中的第一条记录插入到SQL Server数据库中,而其他所有记录都被忽略了。如何处理才能将整个Oracle记录集插入/更新到SQL Server数据库中。


你拥有第一名,这可能是问题所在。也许在这里使用合并命令会更好。 - Chuck
@Chuck,我该如何合并?我是存储过程的新手,无法理解。 - Sid
2个回答

2

我将单独的更新和插入操作转换为一个合并语句:

Create PROCEDURE  [dbo].[uspInsertorUpdateDepartment]
@dept_name varchar(64), 
@jax_dept_id char(32)
AS 
BEGIN  
SET NOCOUNT ON;

  merge afm.[jax_dept] as target
  using (select @dept_name as dept_name, @jax_dept_id as jax_dept_id) as source
  on source.jax_dept_id = target.jax_dept_id
  when matched then
    update target
        SET dept_name = @dept_name
  when not matched then
    insert (dept_name, jax_dept_id) 
    values (@dept_name,@jax_dept_id)
  ;
END

0

使用表类型作为存储过程的参数,而不是逐个传递。如果使用用户定义表值作为参数,可以使用循环函数模块。

CREATE TYPE dbo.SampleType AS TABLE 
(
     dept_name varchar(64) not null, 
     jax_dept_id char(32) not null
)
---
Create PROCEDURE  [dbo].[uspInsertorUpdateDepartment]
@TVP dbo.SampleType READONLY
AS
BEGIN  
SET NOCOUNT ON;
--your insert or update query

如需了解如何使用表值参数,请查看此链接: https://learn.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接