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

时间:2016-01-15 03:21:26

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

我需要从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. 不允许换行。
  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/,没有成功。

1 个答案:

答案 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作为列的数据类型。