使用多个更新语句更新行和提交

时间:2012-06-18 03:09:56

标签: sql sql-server

我正在更新一个包含空间类型的表,并且我可能需要执行三个或更多更新,以确保几何类型已成功加载到地理类型中。我想要做的是第一次更新并提交尽可能多的行,然后使用第二次更新,第一次更新失败,最后,使用第三次更新,第二次更新失败。

我成功地设法完成了手动操作并使用几何类型更新了所有地理类型。这些是我正在使用的陈述:

更新声明#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

更新声明#3:

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

有没有办法写这个,这样它可以让我在没有遇到错误的地方更新行,然后在发生错误的情况下转到下一个更新语句?

我希望它有意义,任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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