如何将图像列导出到SQL Server中的文件?


Answers:


14

这是我想出的解决方案:

  1. 启用xp_cmdshell

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
    
  2. 如果需要,请创建一个目录xp_cmdshell以获取所需的权限。

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. 将BCP与queryout一起使用

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_db必须是标准表名,即[Yourdb]。[YourSchema]。[YourTable]


1
我尝试了上面的代码,它确实起作用了。由于某种原因,JPG图像前面有4个字符,导致该图像无效。我使用文本编辑器删除了这些内容,瞧瞧。知道这四个字符可能是什么以及如何在导出中将其删除吗?他们是:2B 90 01 00

您导出的列的类型是什么?
Max Vernon

10

我也有同样的问题,额外的4个字节也被添加到了我所有文件的开头。我没有在bcp命令中使用-N选项,而是将其更改为-C RAW。当您这样做时,将提示bcp以下问题:

输入字段FileData [image]的文件存储类型:
输入字段FileData [4]的前缀长度:
输入字段长度FileData [0]:
输入字段终止符[无]: 
您要将此格式信息保存在文件中吗?[是/否]

为了解决这个问题,我在sql服务器的根目录上创建了一个文本文件(i.txt),其中包含以下几行来回答每个问题:

一世
0
0

ñ

然后,我的EXEC bcp行变成:

EXEC master..xp_cmdshell'BCP“从** your_db WHERE id = 1”中选择SELECT column_of_type_image“” C:\ exportdir \ yourfile.pdf“ -T -C RAW <C:\ i.txt'

这导出了我的文件,没有任何其他字符。


2

我到处寻找一种导出我存储的文件类型(PDF,XLS,DOC,XML ...)的IMAGE Column的解决方案。

答案中的方法仅适用于pdf文件。要导出各种文件,我必须按以下方式调整解决方案:

(1.)创建格式模板文件:

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.)打开创建的导出格式文件并进行以下编辑:

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

然后执行您的导出命令:

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.)如果您遇到此错误(像我一样):

“仅当复制到服务器中时,才可以跳过[Microsoft] [SQL Native Client]主机文件列”

确保以下几点:

  • 确保您没有忘记编辑第二行并在此处输入条目数(在这种情况下为1)!
  • 确保最后一行的末尾有一个CRLF,如果没有,CRLF将不起作用!

此后,将导出任何IMAGE Column文件字,而不会出现错误。

向1和2致敬。所有答案均转至以下问题的答案:https : //stackoverflow.com/questions/1366544/how-to-export-image-field-to-file/24006947#24006947


1

如果您对GUI解决方案没有任何问题,那么SSMS SSMSBoost确实有一个很棒的插件,它提供了许多有用的功能,并且当然是预览存储在SQL中的图像的最简单方法(至少在我看来)

注意:您必须在安装此加载项后重新启动SSMS。

安装它并享受预览图像的功能,方法如下:右键单击>可视化为>图片


0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

保持命令在一行-单行!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO

在某些服务器上,xp_cmdshell被禁用,您会得到SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin

-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END

请通过解释此代码的作用来修改您的帖子。
dezso

感谢Erax提供的脚本,它运行非常出色。PS:如果使用SSMS远程运行,则脚本无法提取文件。它必须直接在SQLServer上运行才能拉出附件。
Vaas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.