通过存储过程导出从SQL二进制文件数据(图像)(Exporting binary file data

2019-06-27 14:27发布

我试图出口数量较多的图像文件,内部存储在SQL数据库中的二进制数据。

作为相当新编写SQL存储过程中,我所遇到的一对夫妇非常有用的指南对如何进行存档,但我似乎失去了一些东西。

我运行SQL Server 2008 R2在本地,我试图写我的C上的文件到文件夹:\驱动器。

以下是对我迄今为止的楼内设有商务部分:

BEGIN
DECLARE @cmd VARCHAR(8000)
DECLARE @result int

DECLARE curExportBinaryDocs CURSOR FAST_FORWARD FOR
SELECT 'BCP "SELECT Photograph_Data FROM [ALBSCH Trial].[dbo].[Photograph] WHERE Photograph_ID = '
  + CAST(Photograph_ID AS VARCHAR(500)) + '" queryout "' + @OutputFilePath 
  + CAST(Photograph_ID AS VARCHAR(500)) + '.jpg"' + ' -n -T'
FROM dbo.Photograph

OPEN curExportBinaryDocs   
FETCH NEXT FROM curExportBinaryDocs INTO @cmd
WHILE @@FETCH_STATUS = 0
  BEGIN
     --PRINT @cmd
     EXEC @result = xp_cmdshell @cmd         
     FETCH NEXT FROM curExportBinaryDocs INTO @cmd
  END 
CLOSE curExportBinaryDocs
DEALLOCATE curExportBinaryDocs
END

“@result”总是被设置为“1” xp_cmdshell的调用之后(失败)。 所有表名/字段是正确的,所以我怀疑有什么毛病我的BCP的电话,但我不知道下一个尝试的东西。

任何帮助或建议将是非常欢迎的。

Answer 1:

嗯,首先..(并且对此感到遗憾;))DON“T使用游标..和遗憾的帽子...

一个有关游标的最不好的大部分东西都是他们可以锁定你的表。 我一直为这些目的做(和这是相当快),我用一个for循环..这样

declare @totrow int
      , @currow int
      , @result int
      , @nsql nvarchar(max)

declare @sqlStatements table (
  Id int identity(1, 1)
, SqlStatement varchar(max)
)
insert 
into    @sqlStatements
select  'QUERY PART'
from    table

set @totrow = @@rowcount
set @currow = 1
while @totrow > 0 and @currow <= @totrow
begin
  select @nsql = SqlStatement
  from   @SqlStatements
  where  Id = @currow

  exec @result = xp_cmdshell @nsql

  set @currow = @currow + 1
end

在接下来的部分,确实在SQL Server进程具有足够的权限写入C:驱动器? 此外,看着你的消息窗格中,当你执行你的代码,也许你可以在那里找到的东西吗?

你也可以做,尝试手动执行它。 刚刚得到一个BCP语句,并与xp_cmdshell的执行。 它给任何错误?



Answer 2:

这是我最后的工作程序和格式文件。 我没能找到BCP命令,permision设置和格式文件布局的精细度在同一个地方,所以也许这将是使用的人。

CREATE PROCEDURE [dbo].[ImgExport] 
   @OutputFilePath VARCHAR(500) = 'C:\SQLTest\ '
AS
BEGIN
   DECLARE @totrow int
   DECLARE @currow int
   DECLARE @result int
   DECLARE @nsql nvarchar(4000)
   DECLARE @sqlStatements table (ID int IDENTITY(1, 1),  SqlStatement varchar(max))   

   INSERT
   INTO @sqlStatements
   SELECT 'BCP "SELECT Photograph_Data FROM [ALBSCH_Trial].[dbo].[Photograph] WHERE  Photograph_ID = '''
     + CAST(Photograph_ID AS VARCHAR(500)) + '''" queryout ' + @OutputFilePath 
     + CAST(Photograph_ID AS VARCHAR(500)) + '.jpg -S localhost\SQLEXPRESS2008 -T -f C:\SQLTest\Images.fmt'
   FROM dbo.Photograph  

   SET @totrow = @@ROWCOUNT
   SET @currow = 1
   WHILE @totrow > 0 and @currow <= @totrow
   BEGIN
      SELECT @nsql = SqlStatement
      FROM @sqlStatements
      WHERE ID = @currow
      EXEC @result = xp_cmdshell @nsql
      SET @currow = @currow + 1
   END
END    

格式文件:

9.0  
1  
1       SQLBINARY       0       0       "\t"     1      Photograph_Data                                  ""

我希望帮助别人。



文章来源: Exporting binary file data (images) from SQL via a stored procedure