【问题标题】:SQL Server BLOB image column - extracting with BCP queryout - corrupted files AND bugSQL Server BLOB 图像列-使用 BCP queryout 提取-损坏的文件和错误
【发布时间】:2016-04-20 14:55:45
【问题描述】:

我需要从 SQL Server 2012 的列中导出 pdf 和图像文件。Jonas 在“How to export an image column to files in sql server”中的 3 步过程是我找到的最清晰的说明。我完全按照他所说的做了一切。两个注意事项:

  1. 他在 BCP 语句中说“your_db”的地方,你需要 database_name.schema_name.table_name。
  2. 不允许换行。

在此之后我能够一次导出一个文件,但它们已损坏。这些文件比我可以通过 UI 访问的实际工作 PDF 略小(1-15 KB)。

结果证明这是格式问题 - 如果您不导出 XML 文件,则必须创建一个特殊格式文件。 Conor 有一个很棒的解决方案,在“SQL Server BCP export corrupted file”中介绍了如何创建格式文件并在 BCP 查询中引用它。首先我从命令行创建了格式文件:

C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn>bcp CentricityPM.dbo.PatientProfileAttachment format nul -T -n -f C:\bcpdir\bcpfile.fmt

然后我根据 Conor 的帖子编辑并重新保存了格式文件。我运行了我的 BCP 查询:

EXEC master ..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.PatientProfileAttachment WHERE PatientProfileid = ''11568'' AND type = ''pdf'' " queryout "C:\exportdir\testfile.pdf" -T -N'

错误:

Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Host-file columns may be skipped only when copying into the Server
SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Unable to resolve column level collations
NULL
BCP copy out failed

万事通在“BCP Error: columns may be skipped only when copying into the Server”中指出这是a Microsoft bug reported on 8/6/2010。他建议创建一个列数正确的表格。我创建了一个包含一列和一行数据的表(?!),Conor 在他的帖子中实际引用了它,但直到此时我才真正得到它。

请注意,这对我没有用,因为我不仅需要数据,还需要一种识别方法(我为存储在另一列中的每个文件设置了我想要的名称)。但我还是试了一下——我重新运行了 bcp 格式文件:

C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn>bcp CentricityPM.dbo.PatientProfileAttachment format nul -T -n -f C:\bcpdir\bcpfile.fmt

这是它给我的格式文件:

11.0
1
1       SQLIMAGE            4       0       ""   1     data         ""

这是我所做的编辑 - 我按照下面的 TT 建议更改了数据类型,并将 4 更改为 0:

11.0
1
1       SQLBINARY            0       0       ""   1     data         ""

我运行了我的查询:

EXEC master ..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.TempImageFour" queryout "C:\exportdir\testfile.pdf" -T -fC "C:\bcpdir\bcpfile.fmt" '

它运行没有错误...但文件仍然损坏。

谁能看到我做错了什么?有谁知道单列错误的解决方法?或者,如果您知道可以为我执行此操作的工作工具,那也很棒。我很早就尝试了https://sqlblobextractor.codeplex.com/,但没有成功。

【问题讨论】:

  • 如果我的回答对您没有帮助,请编辑您的问题并添加fmt 文件的内容。
  • 谢谢你的回答TT。我尝试了你所说的 - -fC 和 -C RAW 选项,我将数据类型更改为 SQLBINARY,但我仍然得到一个损坏的文件。我在上面的问题中添加了格式文件 - 原始和编辑。
  • 那么 IIUC,您运行 BCP 不再出现任何错误,但您导出的文件已损坏?尝试在查询中将图像转换为 VARBINARY(MAX):BCP 命令中的"SELECT CAST(data AS VARBINARY(MAX)) FROM CentricityPM.dbo.TempImageFour"
  • 现在您的格式文件看起来与我用来从数据库中导出 zip 文件的格式相同(除了第一行中的版本,并且有空格来分隔格式文件中的字段而不是制表符)
  • 当然欢迎你。 BCP 是我的一种罪恶感 ;-)。

标签: sql-server tsql sql-server-2012 blob bcp


【解决方案1】:

您正在使用参数-f "C:\bcpdir\bcpfile.fmt",但根据我的经验应该是-fC "C:\bcpdir\bcpfile.fmt"。老实说,我不记得为什么了……我曾经做过类似于从数据库中导出文件(.zip)的东西,我的命令有导出文件的-fC 参数。我希望我能给你一个适当的解释。无论如何,HTH。

试试下面的命令:

EXEC master..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.TempImageFour" QUERYOUT "C:\exportdir\testfile.pdf" -T -fC "C:\bcpdir\bcpfile.fmt"'

另一种方法是指定-C RAW 选项。这指定不进行从一个代码页到另一个代码页的转换。

EXEC master..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.TempImageFour" QUERYOUT "C:\exportdir\testfile.pdf" -T -f "C:\bcpdir\bcpfile.fmt" -C RAW'

另外,请确保您的格式文件将 SQLBINARY 作为列的数据类型。

【讨论】:

  • 我真的很困惑我应该在这里提供什么路径或文件名-fC "C:\bcpdir\bcpfile.fmt"
  • @Prdp -f format_file: Specifies the full path of a format file.。你可以阅读这个here。要使用格式文件,您首先需要创建一个。你可以阅读here
  • @Prdp 格式文件描述了从 SQL Server 导出数据时如何输出数据,或者在输入数据时如何格式化数据。例如,它描述了字段分隔符是什么(例如,制表符或逗号分隔的字段)。它描述了行分隔符是什么(例如行之间的/r/n)。它描述了 VARCHAR 字段的字符格式(例如Latin1_General_CI_AI)。您可以通过运行带有特定参数的BCP Utility (format nul -f '...') 来生成这样的格式文件。
猜你喜欢
  • 2015-02-02
  • 2017-11-14
  • 2014-06-07
  • 2014-04-10
  • 2019-11-03
  • 2021-05-29
  • 2013-12-11
相关资源
最近更新 更多