在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在映射
所以删除该修剪和部署的应用程序。并试图运行,它运行没有任何错误,但只是从oracle视图插入到SQL Server数据库的第一条记录,留下所有其他记录。如何处理这个问题,以便将来自oracle的整套记录插入/更新到SQL Server数据库中。
答
这里我转换了单独的更新和插入一个合并声明:
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
你有顶部1,因此这可能是问题。也许合并命令在这里会更好用。 – Chuck
@Chuck我该如何合并。我是存储过程的新手,无法遵循 – Sid