sql - 通过存储过程从 SQL 导出二进制文件数据(图像)

标签 sql sql-server sql-server-2008 tsql

我正在尝试导出相当大量的图像文件,这些图像文件作为二进制数据内部存储在 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

在 xp_cmdshell 调用之后,“@result”始终设置为“1”(失败)。所有表名/字段都是正确的,所以我怀疑我的 BCP 调用有问题,但我不确定下一步要尝试什么。

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

最佳答案

嗯,首先..(对此感到抱歉;))不要使用光标.. 对帽子感到抱歉...

游标最糟糕的事情之一是它们可以锁定您的表。为了这些目的我总是做的(而且速度相当快),我使用 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: 驱动器?另外,当你执行代码时,看看你的消息 Pane ,也许你可以在那里找到一些东西?

您还可以做的,尝试手动执行。只需获取一条 BCP 语句并使用 xp_cmdshell 执行它。它会给出任何错误吗?

关于sql - 通过存储过程从 SQL 导出二进制文件数据(图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204577/

相关文章:

sql - 按 varchar 列排序

sql - 带/不带游标的简单 SQL 过程

sql - Microsoft SQL Server 中的排序依据和自定义排序

sql - 检查我的数据库设计/PHP/MySQL

SQL Server : Joins,重复记录和联合

mysql - sql合并两个查询结果

c# - SqlConnection/SqlCommand 在 Close 和 Dispose 后保持数据库处于使用状态

sql - 检测有序列表中变化的函数

mysql - JPA 如何构建连接条件查询

php - 在php中创建一个多步骤表单