1

空間タイプを使用してテーブルを更新していますが、ジオメトリ タイプが地理タイプに正常に読み込まれるようにするために、3 つ以上の更新を実行する必要がある場合があります。私がやりたいことは、最初の更新でできるだけ多くの行をコミットし、最初の更新が失敗した場所で 2 番目の更新を使用し、最後に 2 番目の更新が失敗した場所で 3 番目の更新を使用することです。

これを手動で行うことに成功し、ジオメトリ タイプを使用してすべての地理タイプを更新しました。これらは私が使用しているステートメントです:

ステートメント #1 を更新します。

Update Postcode set geog = geography::STGeomFromWKB(geom.STAsBinary(), 4326)
FROM Postcode
WHERE geog is null

ステートメント #2 を更新します。

Update Postcode set geog = geography::STGeomFromWKB(geom.STUnion(geom.STStartPoint()).STAsBinary(), 4326)
FROM Postcode
WHERE geog is null

更新ステートメント #3:

Update Postcode set geog = geography::STGeomFromWKB(geom.STBuffer(0.00001).STBuffer(-0.00001).STAsBinary(), 4326) 
FROM Postcode 
WHERE geog is null

これを記述して、エラーが発生していない場所で行を更新し、エラーが発生した場合に次の更新ステートメントに進むことができるようにする方法はありますか?

それが理にかなっており、どんな助けも大歓迎です。

4

1 に答える 1

1

実際にエラーをスローせずに各割り当てをテストする方法がある場合、推奨されるアプローチは、CASEステートメントを使用してそれらを切り替えることです。

   update postcode set geog = case when <test> then <A>
                                   when <testB> then <B>
                                   else <C>
                              end

それ以外の場合、エラーを回避できない場合は、ネストされたtry/catchブロックを使用して確実に実行できます。ただし、特定のステートメント内でエラーが発生した場合、そのステートメント全体がロールバックされる可能性があります(ここでは100%確実ではありません)。3つのステートメントすべてを実行できれば幸いであるように思われたので、これが問題であるかどうかはわかりません。

    BEGIN TRY
        -- A
    END TRY
    BEGIN CATCH
        BEGIN TRY
            -- B
        END TRY
        BEGIN CATCH
            -- C
        END CATCH         
    END CATCH
于 2012-06-18T07:52:32.777 に答える