【问题标题】:Multiple statements in SSIS Execute SQL TaskSSIS中的多个语句执行SQL任务
【发布时间】:2023-03-27 00:23:01
【问题描述】:

在我的 SSIS 包中,我有一个带有 2 个语句的执行 SQL 任务。基本上,它们是:

INSERT INTO table2 SELECT * FROM table1;
TRUNCATE TABLE table1

第一个语句失败(重复记录)。但是 table1 现在是空的!我误解了数据库的基本原理吗?!如果第一条语句失败,我预计整个批次都会失败。

在执行报告中有预期的错误消息: 1. 不能插入重复的键行。 2. 声明已终止。可能的失败原因bla-bla

我的服务器是 SQL Server 2012 SP2 CU1,OLEDB 连接

我不知道该表的其他截断语句。我疯了吗?

【问题讨论】:

  • 如果没有明确的事务来回滚,为什么一个地球不会将它们视为两个独立的独立语句?
  • HLGEM,我一直认为事务是回滚以前的语句而不是取消以下语句的手段。我一直不擅长错误处理。 :( 顺便说一句,当我在每个语句之后添加 GO 时,我得到了最初预期的行为。但是批次等于交易吗?这对我来说是另一个大惊喜。
  • 批次不一定是事务。您需要在线阅读这两个方面的内容。

标签: sql ssis sql-server-2012


【解决方案1】:

你需要捕获错误..

INSERT INTO table2 SELECT * FROM table1;
IF @@ERROR = 0
    TRUNCATE TABLE table1

【讨论】:

  • 感谢您的建议。但我的主要观点是:为什么? SQL Server 不应该在出错时终止批处理吗?我试图在 SQL Server 帮助中找到答案,但找不到。
  • 脚本在遇到错误时不会停止。它将继续通过代码。所以第一条语句是insert into ..。这会失败,并且会记录一个错误并将其排入队列。它将继续下一条语句Truncate table table1。脚本完成后,它将触发调用应用程序。
【解决方案2】:

好的,经过一些测试,我确认这是预期的行为。可能的解决方案包括:

  1. 使用 IF @@ERROR(感谢 t_m!)
  2. 使用 GO 将行拆分为批次。批处理中的行将执行,但下一个批处理不会。
  3. 将行拆分为多个任务 (duh)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多