0

SQL Server カーソルに関するヘルプが必要です。

Declare @DCursor cursor, @OldIndividualID uniqueIdentifier, 
        @NewIndividualID UniqueIdentifier, @NewUniqueColID uniqueIdentifier

Set @DCursor = Cursor For
     Select IndividualID From [MVCOmar2].[dbo].PrideMVCDriver 
     Where UniqueColID='895AE0DE-D2CF-461E-ADA9-14FB8BB59640'
        Set @NewUniqueColID=NEWID()
Open @DCursor
Fetch Next From @DCursor Into @OldIndividualID
While (@@FETCH_STATUS = 0)
Begin
    Set @NewIndividualID=NEWID()
    INSERT INTO [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] ([IndividualID], [ColDiagram],
       [dateEntered]      ,[OfficerID]      ,[UniqueColID]      ,[ESDEditDiagram]) 
    SELECT @NewIndividualID,[ColDiagram]      ,[dateEntered]      ,[OfficerID]      ,
        @NewUniqueColID      ,[ESDEditDiagram] 
        FROM [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] 
       WHERE  [IndividualID]=@OldIndividualID;

    Fetch Next From @DCursor Into @OldIndividualID
End

Close @DCursor
Deallocate @DCursor

上記のコードがあり、Selectステートメントは正常に機能し、2行が返されますが、奇妙な理由でカーソルが機能していません。つまり、個々のIDが存在する必要があるため、挿入ステートメントが意味をなさないものを挿入していません。その選択ステートメントは2つの個別のIDを返すため、挿入ステートメントは機能する必要がありますが、機能しないため、どうすればよいかわかりません...

4

1 に答える 1

5

これにはカーソルを使用しないことをお勧めします。結合に基づく単純な挿入は次のようになります。

DECLARE @NewCollisionDiagram TABLE (
   IndividualID uniqueidentifier,
   UniqueCOlID uniqueidentifier
);

INSERT MVCOmar2.dbo.PrideMVCCollisionDiagram (
   IndividualID,
   ColDiagram,
   dateEntered,
   OfficerID,
   UniqueColID,
   ESDEditDiagram
)
SELECT
   newid() NewIndividualID, //alias not needed but here for clarity
   CD.ColDiagram,
   CD.dateEntered,
   CD.OfficerID,
   newid() NewUniqueColID,
   CD.ESDEditDiagram
OUTPUT
   inserted.NewIndividualID,
   inserted.NewUniqueColID
INTO
   @NewCollisionDiagram
FROM
   MVCOmar2.dbo.PrideMVCCollisionDiagram CD
   INNER JOIN MVCOmar2.dbo.PrideMVCDriver D
      ON CD.IndividualID = D.IndividualID 
WHERE
   D.UniqueColID = '895AE0DE-D2CF-461E-ADA9-14FB8BB59640';

NewIndividualIDこれで、新しい値と値を使用する必要がある場合はNewUniqueColID、テーブルから取得でき@NewCollisionDiagramます。行ごとの処理を使用する必要がある場合 (メールの送信やテーブルの作成など、絶対に必要な処理を行っている場合) は、データの最終的な形式を持つテーブルで、最後の 1 秒でのみ実行できます。行ごとに処理する必要がある直前。

発生している問題を解決するには、上記の最後の INSERT ステートメントを単純な SELECT に調整し、プロセスを試して、出力が期待どおりかどうかを確認することをお勧めします。カーソル内の暗黙の JOIN ロジックが正しくない可能性があります。

挿入先と同じテーブルから選択する方法と、Driver テーブルの IndividualID が CollisionDiagram テーブルに既に存在するかどうかに矛盾が生じる可能性があります。

于 2012-08-03T17:13:32.533 に答える