2012-06-18 65 views
1

我正在使用空間類型更新表,並且可能需要執行三個或更多更新以確保幾何類型已成功加載到地理類型中。我想要做的是對我們進行第一次更新並提交儘可能多的行,然後使用第一次更新失敗的第二次更新,最後使用第二次更新,第二次更新失敗。更新行並使用多個更新語句提交

我成功地完成了這項工作,並使用幾何類型更新了所有地理類型。這些是我使用的語句:

Update語句#1:

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

Update語句#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 

是有一種方法可以讓我在沒有遇到錯誤的地方更新行,然後繼續下一次更新聲明如有錯誤?

我希望它是有道理的,任何幫助將不勝感激。

+0

** SQL **不是數據庫 - 它是查詢語言。所以我假設你說* SQL *(語言),你的意思是** SQL Server ** - 微軟的關係數據庫產品 - 對嗎?因此,爲了更加清晰,請使用'sql-server'(或特定於版本的標記)而不是一個通用的'sql'標記。 –

回答

1

如果有一種方法可以在不實際引發錯誤的情況下測試每個賦值,那麼首選的方法是使用CASE語句在它們之間切換。

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

否則,如果無法避免錯誤,則可以使用嵌套try/catch塊來確保執行。但是,當給定語句中發生錯誤時,整個語句可能會回滾(這裏不是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