我正在尝试导出相当大量的图像文件,这些图像文件作为二进制数据内部存储在 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: 驱动器?另外,当您执行代码时,请查看消息窗格,也许您可以在那里找到一些东西?
您还可以尝试手动执行它。只需获取一条 BCP 语句并使用 xp_cmdshell 执行它即可。它会给出任何错误吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)