SQL Server BLOB 映像列 - 使用 BCP 查询输出提取 - 损坏的文件和错误



>我需要从SQL Server 2012中的列中导出pdf和图像文件。Jonas在"如何将图像列导出到sql server中的文件"中的3步过程是我发现的最清晰的说明。我完全按照他说的做了一切。两个注意事项:

  1. 当他在BCP语句中说"your_db"时,你需要database_name.schema_name.table_name。
  2. 不允许换行。

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

事实证明这是一个格式问题 - 如果您不导出XML文件,则必须创建一个特殊的格式化文件。Conor 在"SQL Server BCP 导出损坏的文件"中有一个很好的解决方案,它告诉如何创建格式化文件并在 BCP 查询中引用它。首先,我从命令行创建了格式化文件:

C:Program Files (x86)Microsoft SQL Server110ToolsBinn>bcp CentricityPM.dbo.PatientProfileAttachment format nul -T -n -f C:bcpdirbcpfile.fmt

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

EXEC master ..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.PatientProfileAttachment WHERE PatientProfileid = ''11568'' AND type = ''pdf'' " queryout "C:exportdirtestfile.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

Jon of All Trades 在"BCP 错误:只有在复制到服务器时才能跳过列"中指出,这是 2010 年 8 月 6 日报告的一个Microsoft错误。他建议创建一个具有正确列数的表。我创建了一个包含一列和一行数据(?!)的表,Conor实际上在他的帖子中引用了这些数据,但直到这一点我才真正得到它。

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

C:Program Files (x86)Microsoft SQL Server110ToolsBinn>bcp CentricityPM.dbo.PatientProfileAttachment format nul -T -n -f C:bcpdirbcpfile.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:exportdirtestfile.pdf" -T -fC "C:bcpdirbcpfile.fmt" '

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

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

您正在使用参数-f "C:bcpdirbcpfile.fmt"但根据我的经验,这应该-fC "C:bcpdirbcpfile.fmt".老实说,我已经不记得为什么了...我曾经制作过类似于从数据库导出文件 (.zip) 的东西,我的命令-fC导出文件的参数。我可以给你一个适当的解释。无论如何,呵呵。

尝试以下命令:

EXEC master..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.TempImageFour" QUERYOUT "C:exportdirtestfile.pdf" -T -fC "C:bcpdirbcpfile.fmt"'

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

EXEC master..xp_cmdshell 'BCP "SELECT data FROM CentricityPM.dbo.TempImageFour" QUERYOUT "C:exportdirtestfile.pdf" -T -f "C:bcpdirbcpfile.fmt" -C RAW'

此外,请确保格式化文件已SQLBINARY为列的数据类型。

最新更新