SSIS包。检查表是否存在,如果不存在则创建Truncate

时间:2014-11-12 10:54:34

标签: c# sql ssis

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

我在包的最顶部有一个简单的查询来返回目标数据库中的所有表

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

如何将这些结果传递给下一步,以检查这些表名是否包含在表名列表或数组中

谢谢

2 个答案:

答案 0 :(得分:5)

您需要使用带有纯T-SQL代码的Execute SQL Task。 (更确切地说:Execute SQL TaskExecute T-SQL Statement Task)。

Execute SQL Task中,您需要指定要使用的连接管理器以及要运行的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

此任务在程序包的Control flow中指定,并且应该包含一个约束,以便在任何数据流任务尝试使用受影响的表之前运行它。

请记住,并非所有表都可以被截断(如果它们有FK),并且如果您使用IDENTITY PK,它们将在每次运行时增加。所以,也许您应该DROP表和CREATE然后再次执行所有包。考虑到你必须编写CREATE TABLE脚本。 (当然,你应该在丢弃它之前检查表是否存在)。

答案 1 :(得分:1)

我不确定在SSIS中开箱即用的方法很棒。然而,有一种替代解决方案,BIML。它有一个轻微的学习曲线,但一旦你完成它就很简单。

实际上,这个教程看起来就像你正在尝试做的那样。 BIML的优点在于你只需编写一次,如果你再次需要它,只需几次快速更新即可重新生成新包。超级强大。试试看。我会是你会感到惊讶。 http://bimlscript.com/Walkthrough/Details/73