SSIS - 将多个SQL Server表导出到多个文本文件
我必须在两个SQL Server DB之间移动数据。我的任务是将数据导出为文本(.dat)文件,移动文件并导入到目标中。我必须迁移超过200个表格。SSIS - 将多个SQL Server表导出到多个文本文件
这是我试过
1)我使用了一个执行SQL任务来获取我的表。 2)使用a用于每个循环循环遍历集合中的表名称。 3)在每个循环内部使用脚本任务来构建文本文件目标路径。 4)调用一个DFT,其中源变量的表名称为源ole数据库,目标平面文件的变量中的路径名称。
第一个表提取罚款,但第二个表炸弹与同步错误。我看到这是很多帖子,但找不到与我的场景相匹配的帖子。因此张贴在这里。
即使我得到的包带多的DFT工作,从第二DFT第二个表不导出列,因为平面文件连接管理器还记得第一个表列。有没有办法让它忘记列?
有关如何使用动态源和目标变量使用一个DFT将多个表导出到多个文本文件的任何想法?
感谢并感谢您的帮助。
我想出了一个方法来做到这一点。如果有人陷入同样的情况,我想我会分享。
因此,总之,我需要通过文件导出和导入数据。出于各种原因,我也想尽可能使用格式文件。
我所做的是
1)构造一个DFT这让我的表名的列表,从我需要导出数据库。我使用'oledb'作为源和'记录集目标'作为目标,并将表名存储在对象变量中。
DFT并不是真的有必要。你可以用其他方式做。另外,在我们的应用程序中,我们将表名存储在一个表中。
2)添加一个“对于每个循环容器”与“对于每个ADO枚举”这需要我的对象变量来自前面步骤进入收集。
3)由一个解析变量之一,并构造像下面BCP语句脚本任务内部。根据需要创建变量。 BCP语句将存储在一个变量中。
通过各表环和构建多个BCP语句这样。
BCP “DBNAME.DBO.TABLENAME1” 走出去 “路径\ FILENAME2.dat” -s服务器-T -t “| ” -r $ \ n -f “PATH \ filename.fmt”
BCP “DBNAME.DBO.TABLENAME1” 走出去 “路径\ FILENAME2.dat” -s服务器-T -t “| ” -r $ \ n -f “PATH \ filename.fmt”
这些语句放在一个.bat文件中。这也是在脚本任务内完成的。
4)执行进程任务接下来将执行.BAT文件。我必须这样做,因为我没有选择在我的公司中使用'master..xp_cmdShell'命令或'BULK INSERT'命令。如果我可以选择执行cmdshell,我可以直接从包中运行命令。
5)再次为每个循环容器添加一个'For Each ADO Enumerator',它将上一步中的对象变量放入集合中。
6)逐个解析变量并在脚本任务中构建像这样的BCP语句。根据需要创建变量。 BCP语句将存储在一个变量中。
我循环遍历表并构建多个BCP语句,如下所示。
BCP “DBNAME.DBO.TABLENAME1” 中的 “PATH \ FILENAME2.dat” -s服务器-T -t “| ” -r $ \ n -b10000 -f “PATH \ filename.fmt”
BCP “DBNAME.DBO.TABLENAME1” 中的 “PATH \ FILENAME2.dat” -s服务器-T -t “| ” -r $ \ n -b10000 -f “PATH \ filename.fmt”
这些语句放在一个.bat文件中。这也是在脚本任务内完成的。
-b10000被放置,所以我可以批量导入。如果没有这么多的大表,由于tempdb中的空间不足而无法复制。
7)运行.bat文件再次导入文件。
我不确定这是否是最佳解决方案。我仍然认为我会分享满足我的要求的东西。如果我的回答不明确,我会很乐意解释你是否有任何问题。我们也可以优化这个解决方案。完全可以通过VB脚本来完成,但您必须编写一些代码才能完成此操作。
我还创建了一个包配置文件,我可以在其中动态更改数据库名称,服务器名称,数据和格式文件位置。
谢谢。
不幸的是,批量导入任务仅使我们能够有效地使用格式文件来映射源和目标之间的列。批量导入任务使用BULK INSERT TSQL命令导入数据,执行用户应具有BULKADMIN服务器特权。
由于安全原因,大多数公司不允许BULKADMIN服务器权限启用。 因此使用脚本任务来构建BCP语句是Export的一个很好且简单的选项。 您不需要构建.bat文件,因为脚本本身可以执行在.NET安全帐户下运行的dos命令。
谢谢。是的,我有与特权相同的问题。但是,这种解决方案符合我的需求。 – 2014-12-24 17:33:41
我认为有一个原因,你不只是推动数据从A到B,并跳过整个文件业务? – billinkc 2014-10-10 15:18:04
是的。目标可能是生产有时和我们的DBA和安全不允许由于各种原因。有时我们可能需要保留特定日期的数据,然后在目标数日后重新申请。这两个是原因。 – 2014-10-10 15:22:07
够公平的。简而言之,你无法做你想做的事。数据流紧密绑定到源元数据,并且在运行时无法更改。如果您可以安装[BIDS Helper](http://bidshelper.codeplex。com),我可以告诉你如何使用一些Biml来自动生成软件包代码 – billinkc 2014-10-10 15:29:10