T-SQL中的机制类似于Oracle中的SAVE EXCEPTIONS

时间:2010-12-06 16:43:13

标签: sql-server tsql

是否有类似于Microsoft T-SQL中的Oracle PL / SQL SAVE EXCEPTIONS的机制? 目前我正在使用游标进行更新,速度非常慢。

来自Oracle网站的SAVE EXCEPTIONS的描述:

  

SAVE EXCEPTIONS允许更新,   INSERT或DELETE语句   发出后继续执行   例外。当声明   完成后,会发出错误信号   发生了至少一个异常。   异常被收集到一个数组中   你可以检查使用   声明后的%BULK_EXCEPTIONS   已经执行了。

链接到保存例外定义: http://download.oracle.com/docs/cd/E11882_01/timesten.112/e13076/sqlexamples.htm#TTPLS364

3 个答案:

答案 0 :(得分:2)

如果要导入大量记录,请使用SSIS包ansd将失败的行发送到异常表。如果可以;出于某种原因使用SSIS,请考虑在尝试插入数据之前清理数据,以便没有失败的行。例如,删除任何具有null的记录,其中您需要具有值,使得错误日期为空等等。

如果您来自Oracle,则需要停止使用游标并使用基于集合的逻辑。 SQL Server与游标的性能不佳。

答案 1 :(得分:1)

我认为你最接近模拟这种行为的方法是禁用/启用(带检查)约束。这种方法的缺点是坏数据现在在你的表中,你不能启用约束,直到它被清理。在特定情况下,您需要确定这是否是可接受的风险。

ALTER TABLE YourTable NOCHECK CONSTRAINT ALL

/* Perform your DML operations */

ALTER TABLE YourTable WITH CHECK CHECK CONSTRAINT ALL

/* Deal with any errors that are thrown: 
   'The ALTER TABLE statement conflicted with the CHECK constraint ...' 
   clean up the bad data then enable constraints again */

答案 2 :(得分:1)

不确定您期望什么样的例外。沿着这条线的更多细节可能会有所帮助。

我不相信MS SQL中有任何与您描述的内容相同的内容。一些有点类似的想法:

  • 您可以在SQL中使用TRY ... CATCH,但如果出现问题,这将导致整个批处理失败,而不仅仅是有问题的行。
  • 可以将SSIS批量插入任务配置为具有“失败”行的单独路径,然后您可以根据需要对其进行处理。
  • 如果您正在谈论唯一索引重复(插入所有这些行,如果有任何重复,那么只是忽略它们,但不要使整个批次失败),那么您可以声明唯一使用IGNORE_DUP_KEY选项的索引(请参阅this SO question

更进一步,您可能需要更明确地了解您遇到的错误类型。