Sql-Server-2014

將 .pdf 文件插入表格的游標

  • December 13, 2016

我需要根據其編號將文件夾中的所有 .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,我需要將它插入到 ID123中。我只是想要一個起點。我正在嘗試創建一個游標,循環遍歷所有文件,並使用 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`

我在正確的更新檔上?有沒有辦法用更少的努力做到這一點?

我創建了一個名為 c:\TestPdf 的目錄並創建了兩個 txt 文件,其中包含一些文本(您將使用您的 pdf 文件)

123456789.txt
987654321.txt

從您的範例中,我的假設是您希望將文件 123456789.txt 作為 ID 123 插入,並且您希望將文件 987654321.txt 作為 ID 987 插入。

這個動態 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

引用自:https://dba.stackexchange.com/questions/157957