2013-07-24 88 views
3

我的數據庫中有很多pdf文件,我想根據優先級將它們存儲在一個文件夾中。當我使用下面的代碼時,我無法保存所有文件;它只保存一個文件。 :(如何將許多pdf文件保存到sql server中的文件夾

Declare 
      @File_Path_1 VARBINARY(MAX), 
      @FileName_1 VARCHAR(MAX), 
      @Timestamp_1 varchar(max), 
      @objectToken_1 int 

DECLARE cFiles CURSOR FAST_FORWARD FOR 
SELECT request_number from data where priority=1 
OPEN cFiles 

FETCH NEXT FROM cFiles INTO @FileName_1 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @FileName_1 = @FileName_1 
    set @Timestamp_1='c:\Dump\1.pdf' 
    EXEC sp_oacreate 'ADODB.Stream', @ObjectToken_1 OUTPUT 
    EXEC sp_oasetproperty @objecttoken_1, 'type', 1 
    EXEC sp_oamethod @objecttoken_1,'open' 
    EXEC sp_oamethod @objecttoken_1,'Write',Null,@File_Path_1 
    EXEC sp_oamethod @objecttoken_1,'Savetofile',Null,@Timestamp_1,2 
    EXEC sp_oamethod @objecttoken_1,'Close' 
    EXEC sp_oamethod @objecttoken_1,'open' 

    FETCH NEXT FROM cFiles INTO @FileName_1 
END 

CLOSE cFiles 
DEALLOCATE cFiles 

上面的代碼獲取我只是一個記錄任何一個可以請

+0

這是否查詢:'選擇從數據request_number其中優先級= 1'得到你想要輸出的所有文件的清單? –

+0

你確定你不是隻寫了'c:\ Dump \ 1.pdf'多次? – Paparazzi

+0

@GoatCO是它列出了數據庫中存在的文件 – Zack

回答

0
DECLARE @SOURCEPATH VARBINARY(MAX), 
@DESTPATH VARCHAR(MAX), 
@ObjectToken INT, 
@Request_Number varchar(30) 

DECLARE PDFPATH CURSOR FAST_FORWARD FOR 
SELECT ID from Table 
OPEN PDFPATH 
FETCH NEXT FROM PDFPATH INTO @SOURCEPATH, @Request_Number 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @DESTPATH = 'C:\path' + CAST(@Request_Number AS varchar) + '.pdf' 
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT 
EXEC sp_OASetProperty @ObjectToken, 'Type', 1 
EXEC sp_OAMethod @ObjectToken, 'Open' 
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @SOURCEPATH 
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @DESTPATH, 2 
EXEC sp_OAMethod @ObjectToken, 'Close' 
EXEC sp_OADestroy @ObjectToken 

FETCH NEXT FROM PDFPATH INTO @SOURCEPATH, @Request_Number 
END 

我希望這個片段可以幫助人們誰需要幫助:)謝謝大家對我的幫助:)

+0

1)你應該提到你從http://heidibrebels.be/blog/archives/2011複製這段代碼/ save-image-sql-server-file-sql和2)你應該複製它的所有內容,包括最後的CLOSE和DEALLOCATE語句,3)你的SELECT語句不要求源數據。這並不比原來的問題好得多。 –

+0

該博客的鏈接現已[更改](http://heidibrebels.be/blogpost.php?p=14) – abhi

0

的主要問題是,你是不是動態創建的文件名:

set @Timestamp_1='c:\Dump\1.pdf'

應該是這樣的:

set @Timestamp_1='c:\Dump\' + CONVERT(VARCHAR(50), @FileName_1) + '.pdf'

而且你似乎並不越來越源數據寫出來; @ File_Path_1永遠不會被設置。您需要在SELECT列表中添加一個字段,並將@ File_Path_1變量添加到FETCH語句中。

此外,該行不會做任何事情:

SET @FileName_1 = @FileName_1

相關問題