我正在尝试导出相当大量的图像文件,这些文件以二进制数据的形式内部存储在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执行即可。它会给出任何错误吗?