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

SSIS-将多个SQL Server表导出到多个文本文件,ssis,Ssis,我必须在两个SQL Server数据库之间移动数据。我的任务是将数据导出为文本(.dat)文件,移动文件并导入目标。我必须迁移200多个表 这就是我试过的 1) 我使用执行SQL任务来获取我的表。 2) 使用For each循环遍历集合中的表名。 3) 在for each循环中使用脚本任务来构建文本文件目标路径。 4) 使用源ole db变量中的表名和目标平面文件变量中的路径名调用DFT 第一个表提取得很好,但第二个表出现同步错误。我看到这是许多帖子,但找不到一个符合我的情况。因此在这里发布 即

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

这就是我试过的

1) 我使用执行SQL任务来获取我的表。 2) 使用For each循环遍历集合中的表名。 3) 在for each循环中使用脚本任务来构建文本文件目标路径。 4) 使用源ole db变量中的表名和目标平面文件变量中的路径名调用DFT

第一个表提取得很好,但第二个表出现同步错误。我看到这是许多帖子,但找不到一个符合我的情况。因此在这里发布

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

关于如何使用动态源和目标变量,使用一个DFT将多个表导出到多个文本文件,有什么想法吗


谢谢并感谢您的帮助。

我想出了一个办法。我想如果有人陷入同样的境地,我会和大家分享

总之,我需要通过文件导出和导入数据。出于各种原因,如果可能的话,我还想使用一个格式化文件

我所做的是

1) 构造一个DFT,它从数据库中获取需要导出的表名列表。我使用“oledb”作为源,“recordset destination”作为目标,并将表名存储在一个对象变量中

DFT并不是真正必要的。你可以用任何其他方法。此外,在我们的应用程序中,我们将表名存储在一个表中

2) 添加一个带有“For each ADO枚举器”的“For each循环容器”,该枚举器将上一步中的my object变量带入集合

3) 逐个解析变量并在脚本任务中构造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\u cmdShell”命令或“BULK INSERT”命令的选项。如果我有执行cmdshell的选项,我可以直接从包中运行该命令

5) 再次添加一个带有“For each ADO枚举器”的“For each循环容器”,该枚举器将上一步中的对象变量带入集合

6) 逐个解析变量,并在脚本任务中构造BCP语句,如下所示。根据需要创建变量。BCP语句将存储在变量中

我循环遍历这些表,并像这样构造多个BCP语句

BCP“PATH\FILENAME2.dat”-S SERVERNAME-T-T“|”-r$\n-b10000-f“PATH\filename.fmt”中的“DBNAME.DBO.TABLENAME1”

BCP“PATH\FILENAME2.dat”-S SERVERNAME-T-T“|”-r$\n-b10000-f“PATH\filename.fmt”中的“DBNAME.DBO.TABLENAME1”

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

将-b10000放入,以便我可以批量导入。没有这个,由于tempdb中的空间较少,我的许多大型表都无法复制

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

我不确定这是否是最好的解决办法。我仍然认为我会分享满足我要求的东西。如果我的回答不清楚,如果您有任何问题,我很乐意解释。我们还可以优化此解决方案。同样的事情也可以通过VB脚本来完成,但是你必须编写一些代码来完成

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


谢谢。

不幸的是,批量导入任务只能使我们有效地使用格式文件在源和目标之间映射列。批量导入任务使用批量插入TSQL命令导入数据,以执行用户应有的BULKSADMIN服务器权限

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

我想这是您不只是将数据从a推到B并跳过整个文件业务的原因吧?是的。目标有时可能是生产,我们的DBA和安全部门出于各种原因不允许这样做。有时,我们可能需要保留某一天的数据,然后在目标中的几天后重新申请。这两个是原因,很公平。简而言之,你不能做你想做的事。数据流与源元数据紧密绑定,不能在运行时更改。如果您可以安装,我可以向您展示如何使用一些BIMLTANK自动生成包,以获得快速的答案。我会检查我是否可以在我的公司安装BIDS Helper并返回给你。BIDS Helper没有安装选项。它是将biml转换为ssis包的机制。相当圆滑。另外,除了bi开发经验之外,还有一个很好的全方位的补充,谢谢。是的,我也有同样的特权问题。然而,这个解决方案适合我的需要。