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

问题描述:

我目前正在从Oracle数据库中的视图中获取一组记录,并尝试将它们插入/更新到SQL Server表中的表中,具体取决于一个使用BizTalk的列。在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 

我创建的模式使用消耗适配器服务的存储过程。在映射和编排中使用它们。虽然我无法使用该修剪的functoid在映射

enter image description here

所以删除该修剪和部署的应用程序。并试图运行,它运行没有任何错误,但只是从oracle视图插入到SQL Server数据库的第一条记录,留下所有其他记录。如何处理这个问题,以便将来自oracle的整套记录插入/更新到SQL Server数据库中。

+0

你有顶部1,因此这可能是问题。也许合并命令在这里会更好用。 – Chuck

+0

@Chuck我该如何合并。我是存储过程的新手,无法遵循 – Sid

这里我转换了单独的更新和插入一个合并声明:

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 

使用表类型作为SP的参数,而不是单独通过。如果我们使用用户定义表值作为参数,我们可以使用循环functoid 。

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 

有关如何使用表值参数看看这个链接更多的Infor: - https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine