2016-05-27 1 views
0

Можно рефакторинга эти запросы:Рефакторинга НАЧАТЬ TRY/CATCH заявление для исполнения

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 я удалить, потому что у меня есть 'contraint key' на этой таблице – Mercer

+0

Таким образом, если следующие записи (id_etat_personne, id_precision) существуют:' (1, 2) ',' (1, 9) ',' (2, 2) ',' (3, 2) ', первый блок try/catch удалит * все четыре * из них. Это действительно то, что вы хотите? – Heinzi

+0

@Heinzi 'id_precision (2,3,7,8)' устарел, я хочу обновить все 'id_precision (2,3,8)' в направлении 'id_precision = 9' и для' id_precision (7) 'to' id_precision = 12' – Mercer

ответ

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

Я не уверен, почему строка будет удалена, если обновление не удастся. Если обновление не удалось, то, возможно, также удаляется.

+0

Когда я делаю этот запрос, у меня есть ошибка в 'CONSTRAINT', я пишу это – Mercer

+0

@Mercer. , , Я не понимаю, почему это приведет к нарушению ограничения, где ваш запрос не будет. –

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

+0

Сообщение об ошибке: 'Неверный синтаксис рядом с ключевым словом 'SELECT' .' – Mercer

+0

Корректировка:' НЕ СУЩЕСТВУЕТ' – Mercer