C# SSIS包。检查表是否存在,如果不存在,则创建它们是否截断

C# SSIS包。检查表是否存在,如果不存在,则创建它们是否截断,c#,sql,ssis,C#,Sql,Ssis,我是SSIS的新手,我必须创建一个SSIS包来将数据从一个数据库迁移到另一个数据库。我想通过检查目标数据库中是否存在多个表来启动包。如果它们确实存在,我想截断它们,如果它们不存在,我想创建它们。做这件事最好的方法是什么 我在包的最顶端有一个简单的查询,用于返回目标数据库中的所有表 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' 如何将这些结果传递到下一步,以检查这些表名是否包含在

我是SSIS的新手,我必须创建一个SSIS包来将数据从一个数据库迁移到另一个数据库。我想通过检查目标数据库中是否存在多个表来启动包。如果它们确实存在,我想截断它们,如果它们不存在,我想创建它们。做这件事最好的方法是什么

我在包的最顶端有一个简单的查询,用于返回目标数据库中的所有表

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
如何将这些结果传递到下一步,以检查这些表名是否包含在表名的列表或数组中


谢谢

我不确定SSIS中是否有现成的好方法。然而,还有一种替代解决方案,即BIML。它有一个轻微的学习曲线,但一旦你通过它,它真的很简单


实际上,本教程似乎正是您想要做的。BIML的好处在于,您只需编写一次,如果您再次需要它,只需几次快速更新即可重新生成新的包。超级强大。试试看。我相信你会感到惊讶的

您需要使用带有纯T-SQL代码的
执行SQL任务。(更准确地说:或)

在执行SQL任务的
中,您需要指定要使用的连接管理器以及要运行的SQL代码

任务中的代码应如下所示:

IF EXISTS(
   SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
   WHERE TABLE_TYPE = 'BASE TABLE')
THEN
   TRUNCATE TABLE [BASE TABLE]
ELSE
   CREATE TABLE [BASE TABLE] (...)
END
此任务在包的
控制流
中指定,并应包括在任何数据流任务尝试使用受影响的表之前运行该任务的约束


请记住,并非所有表都可以被截断(如果它们有FKs),并且如果您使用
IDENTITY
PKs,则它们在每次运行包时都会增加。因此,也许您应该
删除
表并
创建
,然后再次执行所有包。考虑到您无论如何都必须编写
CREATE TABLE
脚本。(当然,在删除表之前,您应该先检查它是否存在)。

您可能需要查看该表。如果目标对象存在,您可以将其配置为先删除并重新创建目标对象,如果目标对象不存在,您也可以直接创建目标对象。在完成表检查之后,我想对stage表进行一次简单的数据迁移,我想知道在数据迁移的任何阶段是否会遇到错误,步骤是否会回滚?老实说,我不确定。你期待什么样的错误?不期待任何错误,但你知道这些事情是什么样的,它们随时都可能发生。我试过用谷歌搜索它,但我找不到任何东西来说明如果数据流任务出错会发生什么。回滚取决于您处理事务的方法。默认情况下,TAK和容器处于受支持的
级别,这意味着它们将登记现有事务,但不会自行创建事务。如果需要回滚功能,那么在您的控制流(可能)中,您将把包的事务设置为
Required
。然后,您添加的所有后续任务都将神奇地工作(其中magic是DTC分布式事务协调器)