【问题标题】:BULK INSERT from VARBINARY containing CSV file从包含 CSV 文件的 VARBINARY 批量插入
【发布时间】:2018-07-26 18:36:13
【问题描述】:

我的数据库中有一个需要BULK INSERTed 的 CSV 文件。


实际方案是:

  1. 客户端生成file01.csv
  2. Clientfile01.csv 移动到共享文件夹 \\SERVERNAME\Sharing 中,该文件夹指向 C:\Data服务器
  3. Client 告诉数据库文件名为 file01.csv
  4. 服务器 BULK INSERTs C:\Data\file01.csv 进入决赛桌
  5. 服务器从其队列中删除 file01.csv
    (稍后将被删除)

Windows 共享文件夹有一些 bug 和不稳定,所以我想让它有点不同:

  1. 客户端生成file01.csv
  2. 客户端VARBINARY(MAX)列中插入file01.csv
  3. Server 模拟 CSVVARBINARYBULK INSERTs 进入决赛桌
    (不在服务器端生成任何文件)

我发现实现第二个选项的唯一方法是:

  1. 服务器VARBINARY数据生成temp.csv
  2. 服务器 BULK INSERTs temp.csv 进入决赛桌
    (稍后将被删除)

有没有办法使用VARBINARY 变量而不是BULK INSERT 中的文件?

或者如果不可能,有没有更好的方法来做到这一点?

(在 Google 上搜索了答案,只找到了如何从 CSV 文件中读取 VARBINARY 值,所以我的问题可能是重复的)

【问题讨论】:

  • 如果您愿意并且能够允许客户端将 .csv 插入到具有 varbinary 列的表中,为什么不让他们将其插入到临时表或最终表中?
  • 如果您有 SQL Server 2016 或更高版本,为什么不尝试使用 PolyBase,外部表可以简单地引用文件位置并在读取时应用架构?
  • @Vinnie 这是 SQL Server 2012
  • @TabAlleman 使用 BCP?我在客户端没有它
  • 使用您建议使用的任何方法将 .csv 插入 varbinary。

标签: sql sql-server csv bulkinsert varbinary


【解决方案1】:

您可以执行您描述的一种方法是创建一个 SSIS 包(或就此而言的控制台应用程序),其中包含一个脚本任务,该任务将 Varbinary 列读入单列 DataTable,解析为“final-table-formatted " 数据表,然后进行批量插入。整个过程都在内存中。

【讨论】:

  • 我不想在服务器上运行任何其他程序,但我该怎么做呢?
  • 如果你不想要任何额外的程序,你可以编写一个 CLR proc 来做同样的事情。
【解决方案2】:

您可以将 varbinary(max) 数据插入FileTable。 SQL Server 实际上会将数据写入本地文件,然后您可以使用 BULK INSERT 进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多