2016-05-27 5 views
0

のためのTRY/CATCH文をBEGIN:リファクタリングはそれはこれらのクエリをリファクタリングすることが可能ですパフォーマンス

BEGIN TRY 
    UPDATE ETAT_PERSONNE_PRECISION SET ID_PRECISION = 9 WHERE ID_PRECISION = 2 
END TRY 
BEGIN CATCH 
    DELETE FROM ETAT_PERSONNE_PRECISION WHERE ID_PRECISION = 2; 
END CATCH; 
BEGIN TRY 
    UPDATE ETAT_PERSONNE_PRECISION SET ID_PRECISION = 9 WHERE ID_PRECISION = 3 
END TRY 
BEGIN CATCH 
    DELETE FROM ETAT_PERSONNE_PRECISION WHERE ID_PRECISION = 3; 
END CATCH; 
BEGIN TRY 
    UPDATE ETAT_PERSONNE_PRECISION SET ID_PRECISION = 9 WHERE ID_PRECISION = 8 
END TRY 
BEGIN CATCH 
    DELETE FROM ETAT_PERSONNE_PRECISION WHERE ID_PRECISION = 8; 
END CATCH; 
BEGIN TRY 
    UPDATE ETAT_PERSONNE_PRECISION SET ID_PRECISION = 12 WHERE ID_PRECISION = 7 
END TRY 
BEGIN CATCH 
    DELETE FROM ETAT_PERSONNE_PRECISION WHERE ID_PRECISION = 7; 
END CATCH; 

情報:

制約キー私のテーブルの上に

ALTER TABLE ETAT_PERSONNE_PRECISION ADD CONSTRAINT PK_ETAT_PERSONNE_PRECISION PRIMARY KEY CLUSTERED 
(
    [ID_ETAT_PERSONNE] ASC, 
    [ID_PRECISION] ASC 
) 
+0

@Heinzi次のレコード(id_etat_personne、id_precision)が存在する場合、私は、だから、このテーブル – Mercer

+0

に 'contraint key'を持っているので、私は削除します:'(1、2 )、 '(1,9)'、 '(2,2)'、 '(3,2)'の場合、最初のtry/catchブロックはそれらの4つの*すべてを削除します。これは本当にあなたが望むものですか? – Heinzi

+0

@Heinzi 'id_precision(2,3,7,8)'は廃止されました。すべての 'id_precision(2,3,8)' を 'id_precision = 9'に、' id_precision(7) 'を' id_precision ' = 12 ' – Mercer

答えて

0

することができますこれを実行して1つの更新を行います:

UPDATE ETAT_PERSONNE_PRECISION 
    SET ID_PRECISION = (CASE WHEN ID_PRECISION = 7 THEN 12 ELSE 9 END) 
    WHERE ID_PRECISION IN (2, 3, 8, 7); 

更新が失敗した場合、なぜ行が削除されるのかわかりません。更新に失敗すると、削除も失敗する可能性があります。

+0

私はこの要求をしますが、私はこのCONSTRAINTに@ – Mercer

+0

@マーサーを投稿した時にエラーがあります。 。 。私はなぜこれがあなたの質問ではない制約違反を引き起こすのか分かりません。 –

0

おそらく最初に更新可能な行を最初に処理する必要があります。残りのすべてを削除します。 7と同じ

-- updatebale 
UPDATE epp SET ID_PRECISION = 9 
FROM ETAT_PERSONNE_PRECISION epp 
WHERE epp.ID_PRECISION IN (2,3,8) AND NOT EXISTS (
    SELECT 1 
    FROM ETAT_PERSONNE_PRECISION epp2 
    WHERE epp2.ID_PRECISION = 9 and epp2.[ID_PRECISION] = epp.ID_PRECISION]); 
-- unupdatable 
DELETE FROM ETAT_PERSONNE_PRECISION WHERE ID_PRECISION IN (2,3,8) 

- > 12

+0

エラーメッセージ: 'キーワード 'SELECT'の近くに不正な構文があります。 – Mercer

+0

訂正は' NOT EXISTS'です。 – Mercer

関連する問題