2012-06-18 2 views
1

Я обновляю таблицу с пространственными типами, и есть три или более обновлений, которые, возможно, придется выполнить, чтобы убедиться, что тип геометрии успешно загружен в тип географии. Я хочу сделать первое обновление и зафиксировать как можно больше строк, а затем использовать второе обновление, в котором первый из них был неудачным, и, наконец, использовать третье обновление, в котором вторая ошибка.Обновление строк и фиксация с помощью нескольких операторов обновления

Мне удалось это сделать вручную и обновить все типы географии, используя типы геометрии. Эти заявления, которые я использую:

Обновление заявление # 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 

Update Заявление # 3:

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

ли есть способ написать это, чтобы он позволял мне обновлять строки везде, где ошибка не встречается, а затем перейти к следующему обновлению заявление в случае ошибки?

Надеюсь, что это имеет смысл, и любая помощь будет принята с благодарностью.

+0

** SQL ** не является базой данных - это язык запросов. Поэтому я предполагаю, что вы говорите * SQL * (langauge), и вы действительно имеете в виду ** SQL Server ** - продукт реляционной базы данных Microsoft - правильно? Поэтому для большей ясности используйте «sql-server» (или теги, специфичные для версии), а не только общий тег 'sql'. –

ответ

1

Если есть способ протестировать каждое присваивание без фактического выброса ошибки, предпочтительным подходом является использование оператора CASE для переключения между ними.

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

В противном случае, если ошибка не удается избежать, то вложенные блоки TRY/улова может быть использован для обеспечения выполнения. Однако, когда ошибка возникает в данном операторе, весь этот оператор может быть откат (на 100% не уверен). Вы звучали так, как будто вы были бы счастливы, если бы вы могли просто запустить все три заявления, поэтому не уверены, что это проблема.

BEGIN TRY 
     -- A 
    END TRY 
    BEGIN CATCH 
     BEGIN TRY 
      -- B 
     END TRY 
     BEGIN CATCH 
      -- C 
     END CATCH   
    END CATCH 
+0

Спасибо за ваш ответ. Я понял это и сделал то же самое с курсорами. Как вы сказали, все заявление откат, что было моей проблемой с самого начала. В любом случае, я закончил это в пакете SSIS как задачу потока данных и перенаправил строку ошибки на следующее обновление. – Divi

+0

Рад, что это сработало, хотя и с курсорами. Спасибо за согласие! – crokusek

Смежные вопросы