>我需要从SQL Server 2012中的列中导出pdf和图像文件。Jonas在"如何将图像列导出到sql server中的文件"中的3步过程是我发现的最清晰的说明。我完全按照他说的做了一切。两个注意事项:
- 当他在BCP语句中说"your_db"时,你需要database_name.schema_name.table_name。
- 不允许换行。
在此之后,我能够一次导出一个文件,但它们已损坏。这些文件比我可以通过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
为列的数据类型。