在SSIS 2008中,我有一个脚本任务,它检查数据库中是否存在表并设置一个布尔变量。
在我的数据流中,我根据该变量执行条件分割,以便我可以根据该表是否存在来执行相应的OLE DB命令。
如果表存在,则包将正确运行。但是如果表不存在,SSIS正在检查未运行的OLE DB命令上的元数据,确定表不存在,并且在执行任何操作之前失败并出现错误。
似乎没有任何方法可以捕获或忽略该错误(例如,我尝试增加MaximumErrorCount
和各种不同的ErrorRowDescription
设置),或者阻止它验证命令({{ 1}}似乎只会影响设计师,设计)。
我无权创建存储过程来包装此类测试,并且OLE DB命令不允许您对正在执行的任何语句使用ValidateExternalMetadata
前缀(在本例中为{{{ 1}})。
除了使用脚本组件手动逐行触发IF OBJECT_ID('') IS NOT NULL
命令之外,还有其他方法吗?
答案 0 :(得分:2)
您可以使用脚本组件为输入路径中的每一行执行DELETE语句,但这可能会非常慢,具体取决于要删除的行数。
你可以:
此解决方案比逐行删除要快得多。
如果由于某种原因您无法创建新表,请在SSIS Pass Datasource Between Control Flow Tasks上查看我的答案,以查看将数据传递到下一个数据流的其他方法,您可以使用OleDb source和OleDb命令。无论您选择哪种方式,密钥都处于约束状态,根据变量中的值,将执行或不执行任务(执行SQL任务或数据流)。
请注意,执行SQL任务不会验证查询,因此如果满足约束且表不存在,则在运行时将失败。如果您使用其他数据流而不是执行SQL任务,请将DelayedValidation属性设置为true。这意味着任务将在执行特定任务之前进行验证,而不是在任何时间之前进行验证。