Импорт нескольких файлов PDF в базу данных (имя файла = значение в другом столбце) - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь создать скрипт, который импортирует несколько pdf-файлов в базу данных. Я получил это далеко - конкретный файл:

DECLARE @pdf VARBINARY(MAX)

SELECT @pdf = BulkColumn
FROM OPENROWSET(BULK N'C:\Users\jd\Desktop\Invoiceimage\999999.pdf', SINGLE_BLOB) AS image;

SELECT @pdf, DATALENGTH(@pdf)

INSERT INTO dbo.CustomerInvoiceImage(InvoiceImage, CustomerInvoiceId) VALUES(@Pdf, '13') 
GO 

Работает красиво. Теперь мне нужно, чтобы скрипт взял более одного файла, а также определил имя файла и вставил его в «CustomerInvoiceId» вместо определенного числа 13.

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете использовать этот скрипт.Вам нужно включить / отключить xp_cmdshell только при необходимости.Лучшим решением может быть создание хранимой процедуры с параметром @Folder.

/*
-- enable xp_cmdshell
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
*/

DECLARE @Folder AS VARCHAR(MAX)
SELECT @Folder = 'C:\Users\jd\Desktop\Invoiceimage'

DECLARE @Files AS TABLE(Name VARCHAR(MAX))

DECLARE @shellCommand AS VARCHAR(1024)
SELECT @shellCommand = 'DIR ' + @Folder + '\*.pdf /A-D /B'

INSERT INTO @Files(Name)
EXEC master.dbo.xp_cmdshell @shellCommand

DECLARE @Name AS VARCHAR(MAX)

DECLARE C_Files CURSOR FOR
    SELECT Name
    FROM @Files
    WHERE Name IS NOT NULL

OPEN C_Files
FETCH NEXT FROM C_Files INTO @Name

WHILE @@FETCH_STATUS = 0
BEGIN

    DECLARE @CustomerInvoiceId AS INTEGER
    SELECT @CustomerInvoiceId = CAST(LEFT(@Name, CHARINDEX('.', @Name) - 1) AS INTEGER)

    EXEC ('DECLARE @File AS VARBINARY(MAX); '+
        'SELECT @File = BulkColumn FROM OPENROWSET(BULK N''' + @Folder + '\' + @Name + ''', SINGLE_BLOB) AS IMAGE; ' +
        'INSERT INTO CustomerInvoiceImage(InvoiceImage, CustomerInvoiceId) VALUES(@File, ' + @CustomerInvoiceId + ');'
    )

    FETCH NEXT FROM C_Files INTO @Name

END

CLOSE C_Files
DEALLOCATE C_Files

/*
-- disable xp_cmdshell
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE
GO
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...