SSIS - 将多个SQL Server表导出到多个文本文件

时间:2014-10-10 15:14:53

标签: ssis

我必须在两个SQL Server DB之间移动数据。我的任务是将数据导出为文本(.dat)文件,移动文件并导入目标。我必须迁移超过200个表。

这就是我试过的

1)我使用Execute SQL任务来获取表格。 2)使用a for each循环遍历集合中的表名。 3)在每个循环中使用一个脚本任务来构建文本文件目标路径。 4)在源ole db的变量中使用表名称调用DFT,在目标平面文件的变量中调用路径名称。

第一个表提取正常,但第二个表炸弹同步错误。我看到这是很多帖子,但找不到符合我情景的帖子。因此在这里张贴。

即使我让包使用多个DFT,第二个DFT中的第二个表也不会导出列,因为平面文件连接管理器仍会记住第一个表列。有没有办法让它忘记列?

关于如何使用动态源和目标变量使用一个DFT将多个表导出到多个文本文件的任何想法?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

不幸的是,Bulk Import Task只允许我们有效地使用格式文件来映射源和目标之间的列。批量导入任务使用BULK INSERT TSQL命令导入数据,执行用户应具有BULKADMIN服务器权限。

由于安全原因,大多数公司都不允许启用BULKADMIN服务器权限。 因此,使用脚本任务构建BCP语句是导出的一个简单的选项。 您不需要构造.bat文件,因为脚本本身可以执行在.NET安全帐户下运行的dos命令。

答案 1 :(得分:0)

我找到了一种方法来做到这一点。如果有人陷入同样的​​境地,我想我会分享。

因此,总之,我需要通过文件导出和导入数据。如果出于各种原因,我还想使用格式文件。

我做的是

1)构造一个DFT,它从我需要导出的数据库中获取一个表名列表。我用过oledb'作为来源和'记录集目的地'作为目标并将表名存储在对象变量中。

DFT并不是必需的。你可以用其他任何方式做到这一点。此外,在我们的应用程序中,我们将表名存储在表中。

2)为每个循环容器添加一个'使用' For Each ADO Enumerator'它将我从上一步的对象变量带入集合。

3)逐个解析变量,并在Script任务中构造如下的BCP语句。根据需要创建变量。 BCP语句将存储在变量中。

我遍历这些表并构建多个这样的BCP语句。

BCP" DBNAME.DBO.TABLENAME1" out" PATH \ FILENAME2.dat" -S SERVERNAME -T -t" | " -r $ \ n -f" PATH \ filename.fmt"

BCP" DBNAME.DBO.TABLENAME1" out" PATH \ FILENAME2.dat" -S SERVERNAME -T -t" | " -r $ \ n -f" PATH \ filename.fmt"

语句放在.bat文件中。这也是在脚本任务中完成的。

4)执行流程任务接下来将执行.BAT文件。我不得不这样做,因为我没有选择使用' master..xp_cmdShell'命令或' BULK INSERT'我公司的命令。如果我可以选择执行cmdshell,我可以直接从包中运行命令。

5)再次添加一个'对于每个循环容器'使用' For Each ADO Enumerator'它将我从上一步的对象变量带入集合。

6)逐个解析变量,并在Script任务中构造这样的BCP语句。根据需要创建变量。 BCP语句将存储在变量中。

我遍历这些表并构建多个这样的BCP语句。

BCP" DBNAME.DBO.TABLENAME1"在" PATH \ FILENAME2.dat" -S SERVERNAME -T -t" | " -r $ \ n -b10000 -f" PATH \ filename.fmt"

BCP" DBNAME.DBO.TABLENAME1"在" PATH \ FILENAME2.dat" -S SERVERNAME -T -t" | " -r $ \ n -b10000 -f" PATH \ filename.fmt"

语句放在.bat文件中。这也是在脚本任务中完成的。

-b10000已经放好了,所以我可以批量导入。如果没有这个,由于tempdb中的空间较少,我的许多大表都无法复制。

7)运行.bat文件再次导入文件。

我不确定这是否是最佳解决方案。我仍然认为我将分享满足我要求的内容。如果我的答案不清楚,我很乐意解释你是否有任何问题。我们还可以优化此解决方案。同样可以完全通过VB脚本完成,但你必须编写一些代码才能做到这一点。

我还创建了一个包配置文件,我可以动态更改数据库名称,服务器名称,数据和格式文件位置。

感谢。