gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:13:34 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com