web-dev-qa-db-ja.com

.pdfファイルをテーブルに挿入するためのカーソル

フォルダーのすべての.pdfファイルを、その番号に従ってテーブルに挿入する必要があります。

ファイルのリストを取得できました(フォルダー内にすべての.pdfがあります):

exec master.sys.Xp_dirtree 'The_Folder_where_PDFS_are',0,1

そして、私はそれをテーブルの中に挿入することができました:

CREATE TABLE PDFTest(NumExample integer,image_data VARBINARY(MAX));

DECLARE @NumExample integer
SET @NumExample = 2456789

INSERT INTO PDFTest(NumExample ,image_data)
SELECT @NumExample ,image_data
FROM OPENROWSET(BULK N'C:\DBA\3937052016_Requisição.pdf',SINGLE_BLOB) AS ImageSource(image_data);

Select * from PDFTest

ただし、ご覧のとおり、ファイルには番号(3937052016)にちなんで名前が付けられています。この番号は別のテーブルのIDであるため、PDFファイルが123で始まる場合は、ID 123に挿入する必要があります。開始点。カーソルを作成し、すべてのファイルをループし、left()またはsubstring()関数を使用して数値を取得し、変数に挿入して、insert this pdf into table where left/substring(pdf_name)=idのように比較しようとしています。 。

私はこのような文字列のようなものが必要です:

Insert into tablex ( pdffield ) 
values ( 123_PdfFIle.pdf ( obviously using openrowset )
 where left/substring(123_pdf to get the pdf's code )) = id`

私は正しいパッチを使用していますか?より少ない労力でこれを行う方法はありますか?

1
Racer SQL

C:\ TestPdfというディレクトリを作成し、テキストを含む2つのtxtファイルを作成しました(PDFファイルを使用します)

123456789.txt
987654321.txt

あなたの例から、私の仮定は、ファイル123456789.txtをID 123として挿入し、ファイル987654321.txtをID987として挿入することです。

この動的SQLは私のために働きました-あなたはあなたのデータに対してテストする必要があるでしょう

set nocount on
IF OBJECT_ID('dbo.PDFTest', 'U') IS NOT NULL 
  DROP TABLE dbo.PDFTest; 
Create table PDFTest (NumExample integer,image_data VARBINARY(MAX))
DECLARE @FileTable TABLE (FileName VARCHAR(max),DepthColumn INT,FileColumn INT)

INSERT INTO @FileTable
EXEC master.sys.Xp_dirtree 'c:\testpdf',0,1

DECLARE @cmd VARCHAR(max)
DECLARE @FileName VARCHAR(max)

DECLARE _CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT FileName
FROM @FileTable

OPEN _CURSOR

FETCH NEXT
FROM _CURSOR
INTO @FileName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @cmd = '
INSERT INTO PDFTest(NumExample ,image_data)
SELECT ' + substring(@FileName, 1, 3) + ',image_data
FROM OPENROWSET(BULK N''c:\testpdf\' + @FileName + ''',SINGLE_BLOB) AS ImageSource(image_data)
'

    PRINT @cmd

    EXEC (@cmd)

    FETCH NEXT
    FROM _CURSOR
    INTO @FileName
END --End While

CLOSE _CURSOR

DEALLOCATE _CURSOR

SELECT *
FROM pdftest
2
Scott Hodgin