我正在尝试导出相当大量的图像文件,这些文件作为二进制数据存储在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电话有问题,但我不知道下一步该尝试什么。
非常欢迎任何帮助或建议。
答案 0 :(得分:6)
这是我的最终工作程序和格式文件。我无法找到更精细的细节 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 ""
我希望能帮助别人。
答案 1 :(得分:5)
嗯,首先......(并对此抱歉;))DON“T USE CURSORS .. 并对不起盖帽...
关于游标最糟糕的事情之一是他们可以锁定你的桌子。我总是为这些目的做的事情(而且速度更快),我使用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执行它。它会出现任何错误吗?