我试图出口数量较多的图像文件,内部存储在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
“@result”总是被设置为“1” xp_cmdshell的调用之后(失败)。 所有表名/字段是正确的,所以我怀疑有什么毛病我的BCP的电话,但我不知道下一个尝试的东西。
任何帮助或建议将是非常欢迎的。
嗯,首先..(并且对此感到遗憾;))DON“T使用游标..和遗憾的帽子...
一个有关游标的最不好的大部分东西都是他们可以锁定你的表。 我一直为这些目的做(和这是相当快),我用一个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的执行。 它给任何错误?
这是我最后的工作程序和格式文件。 我没能找到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 ""
我希望帮助别人。