2017-05-24 7 views
3

Je travaille actuellement sur l'obtention d'un ensemble d'enregistrements à partir d'une vue dans la base de données Oracle et en essayant de les insérer dans la table dans la table SQL Server en fonction de une colonne utilisant BizTalk.Insertion/Mise à jour d'une table SQL Server utilisant la procédure stockée dans BizTalk

Pour cela, je crée une procédure stockée:

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 

J'ai créé le schéma de la procédure stockée à l'aide de consommer un service d'adaptation. Les a utilisés dans le mapping et l'orchestration. Bien que je ne pouvais pas utiliser le ébranchage fonctoid dans la cartographie

enter image description here

donc retiré l'ébranchage et déployé l'application. Et essayé de s'exécuter et il s'est exécuté sans aucune erreur, mais il suffit d'insérer le premier enregistrement de la vue Oracle dans la base de données SQL Server en laissant tous les autres enregistrements. Comment cela peut-il être abordé afin que l'ensemble des enregistrements de l'Oracle soit inséré/mis à jour dans la base de données SQL Server.

+0

Vous avez le top 1, de sorte que pourrait être la question. Peut-être qu'une commande de fusion serait une meilleure utilisation ici. – Chuck

+0

@Chuck comment puis-je fusionner. Je suis nouveau à la procédure stockée pas en mesure de suivre – Sid

Répondre

2

Ici, je converti la mise à jour séparée et l'insérer dans une instruction de fusion:

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

Utilisez le type de table comme paramètre pour la SP, au lieu de passer individuellement. Nous pouvons utiliser un fonctoid en boucle si nous utilisons la valeur User Defined Table en tant que paramètre.

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 

Pour plus d'infor sur la façon d'utiliser la table la valeur du paramètre consultez ce lien: - https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine