1

以下にヘルプが必要なストアド プロシージャがあります。その目的は、ステージング DB と本番 DB の違いを見つけることです。違いが見つかると、ストアド プロシージャは正しい情報で運用データベースを更新します。問題は、DB 間に複数の違いがある場合があることです。ストアド プロシージャは、DB 間の違いを一度に 1 つしか処理できません。ストアド プロシージャが、見つけた数の違いを処理できるようにしたいと考えています。一度に 1 つの違いしか処理できない場合は、ストアド プロシージャを継続的に実行する必要があります。どんなアイデアや助けも大歓迎です。

            `BEGIN TRANSACTION

            DECLARE @FILENUM NVARCHAR(30)

            SET @FILENUM = ( SELECT TOP 1 B.ID FROM DBO.ABC_FILE_NUMBER F WITH ( NOLOCK )

                            JOIN DBO.REL_PRIMARY_NUMBER R WITH ( NOLOCK ) ON F.ID = R.FILE_NUMBER_ID

                            JOIN DBO.ABC_PRIMARY_NUMBER P WITH ( NOLOCK ) ON R.PRIMARY_NUMBER_ID = P.ID

                            JOIN DBO.STAGINGDATA S WITH ( NOLOCK ) ON F.FILE_NUMBER_ALIAS = S.ID

                            WHERE S.PRIMARYNUMBER <> P.PRIMARY_NUMBER_ALIAS)

            DECLARE @PRIMNUM NVARCHAR(30)

            SET @PRIMNUM = ( SELECT DISTINCT P.ID FROM DBO.STAGINGDATA S WITH ( NOLOCK )

                            JOIN DBO.ABC_PRIMARY_NUMBER P WITH ( NOLOCK ) ON P.PRIMARY_NUMBER_ALIAS = S.PRIMARYNUMBER

                            WHERE S.ID = ( SELECT F.FILE_NUMBER_ALIAS FROM ABC_FILE_NUMBER WHERE ID = @FILENUM))

            UPDATE  DBO.REL_PRIMARY_NUMBER
            SET     PRIMARY_NUMBER_ID = @PRIMNUM
            WHERE   FILE_NUMBER_ID = @FILENUM

            UPDATE  DBO.ABC_WORKSPACE
            SET     PRIMARY_NUMBER_ID = @PRIMNUM
            WHERE   FILE_NUMBER_ID = @FILENUM

            UPDATE  DBO.ABC_DOCUMENT
            SET     PRIMARY_NUMBER_ID = @PRIMNUM
            WHERE   FILE_NUMBER_ID  = @FILENUM

            UPDATE  DBO.ABC_FILE_NUMBER
            SET     MODIFIED_TIME = GETDATE(), MODIFIED_BY_ID = '21403'
            WHERE   FILE_NUMBER_ID = @FILENUM

            COMMIT`
4

1 に答える 1

0

以下のようにループを作成して、それぞれを「ウォーク」し@FILENUM、現在使用しているのと同じスクリプトを使用して作業を行うことができます。より良いオプションは、各DML操作を書き直して、セットベースの方法で作業を実行し、すべての行を一度に処理することですが、実行している他のアクションによっては、それがオプションではない場合があります。

各FileNumをループする簡単なセットアップは次のとおりです。

declare @Process table (ProcessId int identity(1,1), FileNum nvarchar(30));

-- stage *all* the fileNums (perhaps in some order?)
insert into @Process (FileNum)
    SELECT B.ID FROM DBO.ABC_FILE_NUMBER F WITH ( NOLOCK )
    JOIN DBO.REL_PRIMARY_NUMBER R WITH ( NOLOCK ) ON F.ID = R.FILE_NUMBER_I
    JOIN DBO.ABC_PRIMARY_NUMBER P WITH ( NOLOCK ) ON R.PRIMARY_NUMBER_ID = P.ID
    JOIN DBO.STAGINGDATA S WITH ( NOLOCK ) ON F.FILE_NUMBER_ALIAS = S.ID
    WHERE S.PRIMARYNUMBER <> P.PRIMARY_NUMBER_ALIAS


declare @ProcessId int,
        @FileNum nvarchar(30);

select @ProcessId = min(ProcessId) from @Process;

while @ProcessId is not null
begin

    select @FileNum = FileNum from @Process where ProcessId = @ProcessId;

    print 'Working on FileNum: ' + @FileNum;
    /*
        do your work here
    */

    select @ProcessId = min(ProcessId) from @Process where ProcessId > @ProcessId;

end

セットベースの操作は次のようになります。

declare @Stage table (FileNum nvarchar(30), PrimNum nvarchar(30) primary key  (FileNum));

-- stage the (FileNum:PrimNum) dataset
insert into @Stage (FileNum)
    select FileNum, PrimNum from dbo.yourTables where yourColumn ...

--now perform set based updates
UPDATE  rpn
SET     PRIMARY_NUMBER_ID = s.PRIMNUM
from    @Stage s 
join    DBO.REL_PRIMARY_NUMBER rpn on
        s.FileNum = rpn.FILE_NUMBER_ID

UPDATE  aw
SET     PRIMARY_NUMBER_ID = s.PRIMNUM
from    @Stage s
join    DBO.ABC_WORKSPACE aw on
        s.FileNum = aw.FILE_NUMBER_ID

-- and so on...
于 2012-12-19T19:10:19.983 に答える