0

一度に複数の行をテーブルに追加する必要があります。これらの行には、共通のフィールド値がいくつかあります。カーソルを使用して問題を解決しました。これがストアド プロシージャです。

誰かがそれを行うためのより良い方法を持っていますか?

    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

どうもありがとう。

4

1 に答える 1

1

このようなものはどうですか:

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

私はこれをテストしていません。少し複雑なので、そのままでは機能しない可能性がありますが、アイデアを得ることができるはずです。

于 2012-07-24T03:18:27.313 に答える