2012-06-18 66 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