【问题标题】:SSIS - Export multiple SQL Server tables to multiple text filesSSIS - 将多个 SQL Server 表导出到多个文本文件
【发布时间】:2014-10-10 15:14:52
【问题描述】:

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

这是我尝试过的

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

第一个表提取正常,但第二个表因同步错误而爆炸。我看到这是很多帖子,但找不到与我的情况相匹配的帖子。因此在这里发布。

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

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

感谢并感谢您的帮助。

【问题讨论】:

  • 我认为您不只是将数据从 A 推到 B 并跳过整个文件业务是有原因的?
  • 是的。目标有时可能是生产,我们的 DBA 和安全性由于各种原因不允许这样做。有时我们可能不得不保留特定日期的数据,然后在目标中几天后重新应用。这两个是原因。
  • 很公平。简短的回答是你不能做你想做的事。数据流与源元数据紧密绑定,在运行时无法更改。如果你可以安装BIDS Helper,我可以向你展示如何使用一些 Biml 自动生成包
  • 感谢您的快速答复。我会检查是否可以在我的公司安装 BIDS Helper 并回复您。
  • 竞价助手没有安装选项。它是将 biml 转换为 ssis 包的机制。很光滑。此外,对您的双向开发经验的全面补充

标签: ssis


【解决方案1】:

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

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

【讨论】:

  • 谢谢。是的,我在特权方面遇到了同样的问题。不过,这个解决方案符合我的需要。
【解决方案2】:

我想出了一个办法。如果有人遇到同样的情况,我想我会分享。

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

我做的是

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

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

2) 添加一个带有“For Each ADO Enumerator”的“For each loop container”,它将我上一步中的对象变量放入集合中。

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_cmdShell”命令或“BULK INSERT”命令。如果我可以选择执行 cmdshell,我可以直接从包中运行命令。

5) 再次添加一个带有“For Each ADO Enumerator”的“For each loop container”,它将上一步中的对象变量带入集合中。

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

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

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

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

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

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

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

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

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

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2013-07-12
    • 2018-11-20
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多