当表不存在时,SSIS包会失败,即使它永远不会被访问

时间:2011-11-18 06:34:09

标签: sql-server sql-server-2008 ssis

在SSIS 2008中,我有一个脚本任务,它检查数据库中是否存在表并设置一个布尔变量。

在我的数据流中,我根据该变量执行条件分割,以便我可以根据该表是否存在来执行相应的OLE DB命令。

如果表存在,则包将正确运行。但是如果表不存在,SSIS正在检查未运行的OLE DB命令上的元数据,确定表不存在,并且在执行任何操作之前失败并出现错误。

似乎没有任何方法可以捕获或忽略该错误(例如,我尝试增加MaximumErrorCount和各种不同的ErrorRowDescription设置),或者阻止它验证命令({{ 1}}似乎只会影响设计师,设计)。

我无权创建存储过程来包装此类测试,并且OLE DB命令不允许您对正在执行的任何语句使用ValidateExternalMetadata前缀(在本例中为{{{ 1}})。

除了使用脚本组件手动逐行触发IF OBJECT_ID('') IS NOT NULL命令之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用脚本组件为输入路径中的每一行执行DELETE语句,但这可能会非常慢,具体取决于要删除的行数。

你可以:

  1. 将应删除的记录的PK存储到数据库表中(例如:TBL_TO_DEL)
  2. 使用SQL查询添加执行SQL任务以通过将TBL_TO_DEL与要从中删除记录的表连接来删除记录
  3. precedence constraint放在数据流和执行SQL任务之间的路径上(基于变量的约束)
  4. 此解决方案比逐行删除要快得多。

    如果由于某种原因您无法创建新表,请在SSIS Pass Datasource Between Control Flow Tasks上查看我的答案,以查看将数据传递到下一个数据流的其他方法,您可以使用OleDb source和OleDb命令。无论您选择哪种方式,密钥都处于约束状态,根据变量中的值,将执行或不执行任务(执行SQL任务或数据流)。

    请注意,执行SQL任务不会验证查询,因此如果满足约束且表不存在,则在运行时将失败。如果您使用其他数据流而不是执行SQL任务,请将DelayedValidation属性设置为true。这意味着任务将在执行特定任务之前进行验证,而不是在任何时间之前进行验证。