2017-11-07 52 views
0

SQLサーバーから単一のPDFファイルを特定の場所にコピーできます。 しかし、私はそれを複数のファイルでどうやって行うことができますか?xp_cmdshellを使用して複数のファイルをコピーする方法

EXEC master..xp_cmdshell 'BCP "SELECT PDF FROM [MEJAMES].[dbo].tblPolicyForms WHERE FormID = 20 " queryout "C:\Users\UserName\Docs\Folder\'[email protected]+'.pdf" -T -N' 

私はフォームID、PDFを持つテーブルが、PDF_Filename

select FormID,PDF,PDF_Filename 
from [dbo].[tblPolicyForms] 

enter image description here

はどのように各フォームIDをループ、PDFファイルを抽出し、それに名前を付けることができますPDF_Filename.pdf?これはあなた何でもして出力リストを定義することができますので、私はカーソルの敗走を行ってきました

CREATE TABLE #tblPolicyForms 
(
    FormID INT NOT NULL 
    ,PDF varbinary(max) NULL 
    ,PDF_FIlename VARCHAR(max) 
) 


INSERT INTO #tblPolicyForms 
SELECT FormID, 
     PDF, 
     PDF_FileName 
FROM [dbo].[tblPolicyForms] 
WHERE FormID IN (19,20,21,22) 
--select * from #tblPolicyForms 

DECLARE @FormID varchar(4); 
DECLARE @FileName VARCHAR(200); 

DECLARE FormID_cursor CURSOR FOR 
SELECT 
    FormID 
    ,PDF_FIlename 
FROM 
    #tblPolicyForms 
WHERE FormID IN (19,20,21,22) 
--where whatever conditions you need to get the FormIDs you want to use 


OPEN FormID_cursor 

FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    EXEC master.dbo.xp_cmdshell 'BCP "SELECT PDF FROM [DBname].[dbo].tblPolicyForms " queryout "C:\Users\UserName\Documents\ExportDir\'[email protected]+'" -T -N' 


FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

END 

CLOSE FormID_cursor 
DEALLOCATE FormID_cursor 

enter image description here

+1

クエリデータを1行に1ファイルのBCPまたは.cmdファイルに出力し、代わりにそのファイルを呼び出します。代わりに、xp_cmdshellと呼ばれる文字列を複数行で作成します(例: '' BCP ')。 FormID = 22 "queryout" C:\ Users \ UserName \ Docs \ Folder \ " - T-N '+ CHAR(13)+ CHAR(10)+' BCP"からPDFを選択[MEJAMES]。[dbo] .tblPolicyForms WHERE FormID = IL00034H.pdf "-T -N'' –

答えて

0

UPDATE:それは私にエラーを与えるいくつかの理由

望む

CREATE TABLE #tblPolicyForms 
(
    FormID INT NOT NULL 
    ,PDF TEXT NULL 
    ,PDF_FIlename VARCHAR(200) 
) 


INSERT INTO #tblPolicyForms 
    VALUES(18, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF18Name.pdf') 
    ,(19, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF19Name.pdf') 
    ,(20, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF20Name.pdf') 
    ,(21, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF21Name.pdf') 
    ,(22, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF22Name.pdf') 
    ,(23, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF23Name.pdf') 
    ,(24, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF24Name.pdf') 
    ,(25, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF25Name.pdf') 
    ,(26, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF26Name.pdf') 
    ,(27, 'skjdfsakdjfhsldkfhsdlkjfhsdkfjh', 'PDF27Name.pdf') 


DECLARE @FormID varchar(4); 
DECLARE @FileName VARCHAR(200); 

DECLARE FormID_cursor CURSOR FOR 
SELECT 
    FormID 
    ,PDF_FIlename 
FROM 
    #tblPolicyForms 
--where whatever conditions you need to get the FormIDs you want to use 


OPEN FormID_cursor 

FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    EXEC master.dbo.xp_cmdshell 'BCP "SELECT PDF FROM [MEJAMES].[dbo].tblPolicyForms WHERE FormID = '[email protected]+' " queryout "C:\Users\UserName\Docs\Folder\'[email protected]+'.pdf" -T -N' 
-- SELECT 'BCP "SELECT PDF FROM [MEJAMES].[dbo].tblPolicyForms WHERE FormID = '[email protected]+' " queryout "C:\Users\UserName\Docs\Folder\'[email protected]+'.pdf" -T -N' 

FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

END 

CLOSE FormID_cursor 
DEALLOCATE FormID_cursor 
0
DECLARE @FormID varchar(4); 
DECLARE @FileName VARCHAR(200); 
DECLARE @CmdString VARCHAR(2000); 

DECLARE FormID_cursor CURSOR FOR 
SELECT 
    FormID 
    ,PDF_FIlename 
FROM 
    [dbo].[tblPolicyForms] 
WHERE 
    FormID IN (19,20,21,22) 
--where whatever conditions you need to get the FormIDs you want to use 


OPEN FormID_cursor 

FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @CmdString = 'BCP "SELECT PDF FROM [dbo].[tblPolicyForms] where FormID = '[email protected]+' " queryout "C:\Users\UserName\Documents\ExportDir\'[email protected]+'" -T -N'; 
    EXEC master.dbo.xp_cmdshell @CmdString; 

FETCH NEXT FROM FormID_cursor 
INTO @FormID, @FileName 

END 

CLOSE FormID_cursor 
DEALLOCATE FormID_cursor 
関連する問題