0

T-SQLには次のものがあります。

INSERT INTO tblAttMain(Site, FirstName, LastName)
    SELECT 
        Site, FirstName, LastName
    FROM
        tblAttTmp 
    WHERE
        Site = @Site

ここで行っているのは、列をテーブルにコピーすることtblAttTmpですtblAttMain。selectステートメントは数百行を返す可能性があることに注意してください。tblAttTmpそのレコードの特定のIDを指定するためのIDと呼ばれる主キーがあります。

選択の相互作用ごとにエラーが発生した場合は、のIDを吐き出しtblAttTmp、文字列を作成して、修正が必要なすべてのIDを確認できるようにします。

選択はワンショット取引であるため、方法がわかりません。

4

2 に答える 2

4

あなたが言うように、selectそしてinsert「ワンショット」です。あなたには2つの本当の選択肢があります:

  1. 各行を個別に実行します。これは悪いだけでなく、苦痛でもあります
  2. 発生する可能性のある「エラー」(主キー/一意キー/外部キーの競合、その他の制約違反など)を特定し、挿入を試みる前にデータのエラーを確認してください

(本当に2番目のオプションを使用する必要があります)。

于 2012-04-23T20:27:25.407 に答える
0

このソリューションをカーソルとして実装したいようです。カーソルを使用すると、束としてではなく、一度に1つずつ挿入を実行し、各反復中に処理を実行できます。

DECLARE @Cursor CURSOR FOR
SELECT Site, FirstName, LastName FROM tblAttTmp WHERE Site = @Site

DECLARE @CurrentSite <DataType>
DECLARE @CurrentFirstName <DataType>
DECLARE @CurrentLastName <DataType>

OPEN @Cursor

FETCH NEXT FROM @Cursor INTO @CurrentSite, @CurrentFirstName, @CurrentLastName

WHILE @@FETCH_STATUS = 0
BEGIN
   -- INSERT using @CurrentSite, @CurrentFirstName, @CurrentLastName
   -- Use a Try/ Catch block to catch errors

   FETCH NEXT FROM @Cursor INTO @CurrentSite, @CurrentFirstName, @CurrentLastName
END

CLOSE @Cursor
DEALLOCATE @Cursor
于 2012-04-23T20:28:59.407 に答える