【发布时间】:2016-04-20 14:55:45
【问题描述】:
我需要从 SQL Server 2012 的列中导出 pdf 和图像文件。Jonas 在“How to export an image column to files in sql server”中的 3 步过程是我找到的最清晰的说明。我完全按照他所说的做了一切。两个注意事项:
- 他在 BCP 语句中说“your_db”的地方,你需要 database_name.schema_name.table_name。
- 不允许换行。
在此之后我能够一次导出一个文件,但它们已损坏。这些文件比我可以通过 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