为性能重构BEGIN TRY / CATCH语句

时间:2016-05-27 14:58:26

标签: sql sql-server

可以重构这些查询:

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
)

2 个答案:

答案 0 :(得分:0)

您可以通过执行以下操作执行单个更新:

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);

我不确定为什么在更新失败时会删除该行。如果更新失败,则删除可能也会失败。

答案 1 :(得分:0)

您可能需要先处理可更新的行。然后删除所有其余部分。

-- 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)

与7相同 - > 12