Jonas Asked: 2014-10-23 02:43:26 +0800 CST2014-10-23 02:43:26 +0800 CST 2014-10-23 02:43:26 +0800 CST 如何将图像列导出到 SQL Server 中的文件? 772 我将从数据库迁移。image我想将一列类型导出到文件系统上的二进制文件。每条记录一个文件。如何使用 SQL Server 执行此操作? sql-server migration 6 个回答 Voted Best Answer Jonas 2014-10-23T05:16:58+08:002014-10-23T05:16:58+08:00 这是我想出的解决方案: 启用xp_cmdshell_ EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'xp_cmdshell', 1 GO RECONFIGURE GO 如果需要,创建一个目录xp_cmdshell以获得所需的权限。 EXEC master..xp_cmdshell 'mkdir C:\exportdir' 将 BCP 与查询输出一起使用 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] Jacob Dababneh 2016-07-11T10:34:37+08:002016-07-11T10:34:37+08:00 我在所有文件的开头也添加了额外的 4 个字节,我也遇到了同样的问题。我没有在我的 bcp 命令中使用 -N 选项,而是将其更改为 -C RAW。执行此操作时,将提示 bcp 并提出以下问题: 输入字段 FileData [image] 的文件存储类型: 输入字段 FileData [4] 的前缀长度: 输入字段 FileData [0] 的长度: 输入字段终止符 [无]: 您想将此格式信息保存在文件中吗?[是/否] 为了解决这个问题,我在我的 sql server 的根目录上创建了一个文本文件 (i.txt),其中包含以下行来回答每个问题: 我 0 0 n 然后,我的 EXEC bcp 行变成了: EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -C RAW<C:\i.txt' 这导出了我的文件,没有任何额外的字符。 Magier 2016-06-21T03:52:18+08:002016-06-21T03:52:18+08:00 我四处寻找一种解决方案来导出图像列,该列存储了我想要导出的不同类型的文件类型(pdf、xls、doc、xml ...)。 答案中的方法仅适用于 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]Host-file 列只能在复制到服务器时被跳过” 确保以下内容: 确保您没有忘记编辑第二行并在此处输入条目数(在这种情况下为 1)! 确保你在最后一行的末尾有一个 CRLF,没有这个它就不起作用! 在此之后,任何 IMAGE Column 文件字的导出都没有错误。 1. 和 2. 的致敬都归结为以下问题的答案: https ://stackoverflow.com/questions/1366544/how-to-export-image-field-to-file/24006947#24006947 ABS 2018-01-22T01:47:14+08:002018-01-22T01:47:14+08:00 如果您对 GUI 解决方案没有任何问题,SSMS SSMSBoost有一个非常棒的插件,它提供了许多有用的功能,当然还有预览存储在 SQL 中的图像的最简单方法(至少在我看来) 注意:安装此插件后,您必须重新启动 SSMS。 安装它并享受预览图像的乐趣:右键单击 > 可视化为 > 图片 Arya Mohanan 2018-06-06T21:34:21+08:002018-06-06T21:34:21+08:00 在继续之前,请确保 xp_cmdshell 命令已启用,因为默认情况下它是禁用的。 EXEC sp_configure 'xp_cmdshell', 1; GO RECONFIGURE GO 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 erax 2017-09-16T04:49:57+08:002017-09-16T04:49:57+08:00 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
这是我想出的解决方案:
启用
xp_cmdshell
_如果需要,创建一个目录
xp_cmdshell
以获得所需的权限。将 BCP 与查询输出一起使用
**your_db 必须是完全限定的表名,即 [Yourdb].[YourSchema].[YourTable]
我在所有文件的开头也添加了额外的 4 个字节,我也遇到了同样的问题。我没有在我的 bcp 命令中使用 -N 选项,而是将其更改为 -C RAW。执行此操作时,将提示 bcp 并提出以下问题:
为了解决这个问题,我在我的 sql server 的根目录上创建了一个文本文件 (i.txt),其中包含以下行来回答每个问题:
然后,我的 EXEC bcp 行变成了:
这导出了我的文件,没有任何额外的字符。
我四处寻找一种解决方案来导出图像列,该列存储了我想要导出的不同类型的文件类型(pdf、xls、doc、xml ...)。
答案中的方法仅适用于 pdf 文件。要导出各种文件,我必须调整解决方案如下:
(1.) 创建格式模板文件:
(2.) 打开创建的导出格式文件并以这种方式进行编辑:
然后执行你的导出命令:
(3.) 如果您遇到此错误(就像我一样):
确保以下内容:
在此之后,任何 IMAGE Column 文件字的导出都没有错误。
1. 和 2. 的致敬都归结为以下问题的答案: https ://stackoverflow.com/questions/1366544/how-to-export-image-field-to-file/24006947#24006947
如果您对 GUI 解决方案没有任何问题,SSMS SSMSBoost有一个非常棒的插件,它提供了许多有用的功能,当然还有预览存储在 SQL 中的图像的最简单方法(至少在我看来)
注意:安装此插件后,您必须重新启动 SSMS。
安装它并享受预览图像的乐趣:右键单击 > 可视化为 > 图片
在继续之前,请确保 xp_cmdshell 命令已启用,因为默认情况下它是禁用的。
将命令保留在一行 - 单行!!!