是否有类似于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
答案 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中有任何与您描述的内容相同的内容。一些有点类似的想法:
TRY ... CATCH
,但如果出现问题,这将导致整个批处理失败,而不仅仅是有问题的行。IGNORE_DUP_KEY
选项的索引(请参阅this SO question)更进一步,您可能需要更明确地了解您遇到的错误类型。