2012-07-24 6 views
0

Je dois ajouter plusieurs lignes dans une table à la fois. Ces lignes ont des valeurs de champs communes. J'ai résolu mon problème en utilisant un curseur et c'est le proc stocké.Ajout conditionnel de plusieurs lignes (SQL SERVER 2008)

Est-ce que quelqu'un a une meilleure façon de le faire?

USE [MyDataBase] 
    GO 


    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER PROCEDURE [dbo].[spAddDetailsBatch] 
    (
    @IdOperTur UniqueIdentifier, 
    @IdProd UniqueIdentifier, 
    @Model Bit, 
    @PrAd Decimal(18,2), 
    @PrMe Decimal(18,2), 
    @PoCo Decimal(5,2) 
    ) 
    AS 
    DECLARE @prpr_Id UniqueIdentifier 
    DECLARE @IdCont UniqueIdentifier = NULL 

    DECLARE CPr CURSOR FOR SELECT prpr_Id FROM trsx_PrPr WHERE (prod_Id = @IdProd) 
    OPEN CPr 

    FETCH NEXT FROM CPr INTO @prpr_Id 
    WHILE @@Fetch_Status=0 BEGIN /*iterate through all records from cursor*/ 

    SET @IdCont = (SELECT cont_Id FROM trsx_Cont 
        WHERE (prpr_Id = @prpr_Id) AND (optu_Id = @IdOperTur)) 

    IF @IdCont IS NULL 
    BEGIN 
     INSERT INTO trsx_Cont(cont_Id, prpr_Id, optu_Id, cont_Neto, cont_PrAd, cont_PrMe, cont_PoCo) 
     VALUES (NEWID(), @prpr_Id, @IdOperTur, @Model, @PrAd, @PrMe, @PoCo) 
    END 

    FETCH NEXT FROM CPr INTO @prpr_Id 
    END 
    CLOSE CPr 
    DEALLOCATE CPr 
    RETURN 

Merci beaucoup.

Répondre

1

Que diriez-vous quelque chose comme ceci:

insert into trsx_Cont(cont_Id, prpr_id, optu_Id, cont_Neto, cont_PrAd, cont_PrMe, cont_PoCo) 
select (newid(), trsx_PrPr.prpr_id, @IdOperTur, @Model, @PrAd, @PrMe, @PoCo) 
from trsx_PrPr 
where not exists(
    SELECT 1 
    from trsx_Cont 
    WHERE 
     trsx_Cont.prpr_Id = trsx_PrPr.prpr_Id AND 
     trsx_Cont.optu_Id = @IdOperTur 
) and 
trsx_PrPr.prod_id = @IdProd 

Je n'ai pas testé, et comme il est un peu complexe tel quel peut bien ne pas fonctionner, mais vous devriez être en mesure d'obtenir l'idée.

+0

Ouah !!!! Tout d'abord, ça a marché !!! MERCI BEAUCOUP. –

+0

Ouah !!!! Tout d'abord, ça a marché !!! MERCI BEAUCOUP. Juste quelques commentaires: Quand j'ai vu votre code, j'ai pensé qu'il ne va pas parcourir, évidemment, j'avais tort. J'ai dû supprimer the() dans la clause SELECT à cause de la syntaxe et des erreurs de liaison. Merci encore. –

+0

Pas de problème, content de pouvoir aider. :) –

Questions connexes