我需要从SQL Server 2012中的列导出pdf和图像文件.Jonas在“How to export an image column to files in sql server”中的3个步骤是我发现的最清晰的指令。我按照他的说法做了一切。两个注意事项:
之后我能够一次导出一个文件,但是它们已经损坏了。这些文件比我可以通过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
所有行业的Jon在“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/,没有成功。
答案 0 :(得分: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
作为列的数据类型。