Как конвертировать и хранить изображение на SQL сервере - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы хранить большие изображения на SQL сервере, а затем использовать их в службах Reporting Services, Power BI и Analysis Services.

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

Следует ли мне преобразовать их в Base64? Как мне это сделать?

Я нашел хорошие объяснения по Преобразовать тип данных изображения в строку на SQL сервере , Хранение изображений на SQL сервере? , но ни один из них не работал со мной.

Итак, в моей базе данных есть путь к изображению, само изображение и расширение, как показано ниже:

SELECT
    NM_DIRETORIO AS NM_PATH   ,
    NM_FOTO      AS NM_PICTURE,
    TP_EXTENSAO  AS TP_EXTENSION
FROM D_GB_FOTOS

Example db

As I saw it on from this video SSRS - считывает изображения из SQL базы данных сервера , он использует varbinary(max) для хранения изображений, но я не знаю, как он преобразовал в это. Кроме того, из Крисс Уэбб: Хранение больших изображений в наборах данных Power BI , он использует Base64 для отображения в Power BI.

Итак, мой вопрос: поскольку я буду использовать большие изображения, как Я конвертирую простое изображение (путь + изображение) для хранения в моей SQL базе данных сервера?

Информация:

  • SQL Server 2019 (v15.0.18330. 0)
  • SQL Объекты управления сервером (SMO) v16.100.37971.0
  • Microsoft SQL Server Management Studio v18.5

EDIT:

На основе ответа @ Peter Schneider я создал курсор для обновления таблицы с этим значением. Но я получил ошибку в предложении where (например: TABLE.ID_COLUMN).

Мой курсор:

DECLARE @ID_FOTO INT;
DECLARE @CD_ARQUIVO VARCHAR(4000);
DECLARE @CD_ARQUIVO_VARBINARY VARCHAR(4000);
DECLARE @tsql NVARCHAR (4000);

DECLARE CUR CURSOR FOR SELECT ID_FOTO, CD_ARQUIVO, NM_DIRETORIO + '\' + NM_FOTO + TP_EXTENSAO AS CD_ARQUIVO_VARBINARY FROM D_GB_FOTOS WHERE LINORIGEM <> 'CARGA MANUAL'
OPEN CUR

FETCH NEXT FROM CUR INTO @ID_FOTO, @CD_ARQUIVO, @CD_ARQUIVO_VARBINARY

WHILE @CD_ARQUIVO IS NULL BEGIN
    SET @tsql = 'UPDATE D_GB_FOTOS' +
                'SET CD_ARQUIVO = (SELECT CD_ARQUIVO.* from Openrowset(Bulk' + @CD_ARQUIVO + ', Single_Blob) CD_ARQUIVO)' +
                'WHERE ' + @ID_FOTO + ' = D_GB_FOTOS.ID_FOTO;'  
    PRINT (@tsql)
    EXEC  (@tsql)
    FETCH NEXT FROM cur INTO @ID_FOTO, @CD_ARQUIVO
END

CLOSE cur    
DEALLOCATE cur

EDIT 2:

Некоторые изменения в запросе, но есть одна последняя проблема, когда он продолжает обновляться и не останавливается на окончательном идентификаторе таблицы:

DECLARE @ID_FOTO INT;
DECLARE @CD_ARQUIVO VARCHAR(4000);
DECLARE @CD_ARQUIVO_VARBINARY VARCHAR(4000);
DECLARE @tsql NVARCHAR (4000);
DECLARE @ID_FOTO_MAX INT;

SET @ID_FOTO_MAX = (SELECT MAX(ID_FOTO) AS ID_FOTO FROM D_GB_FOTOS);

DECLARE CUR CURSOR FOR SELECT ID_FOTO, CD_ARQUIVO, (NM_DIRETORIO + '\' + NM_FOTO + TP_EXTENSAO) AS CD_ARQUIVO_VARBINARY FROM D_GB_FOTOS WHERE LINORIGEM <> 'CARGA MANUAL';
OPEN CUR

FETCH NEXT FROM CUR INTO @ID_FOTO, @CD_ARQUIVO, @CD_ARQUIVO_VARBINARY

WHILE (@ID_FOTO <= @ID_FOTO_MAX) BEGIN
    SET @tsql = 'UPDATE D_GB_FOTOS ' +
                'SET CD_ARQUIVO = (SELECT CD_ARQUIVO from Openrowset(Bulk ''' + @CD_ARQUIVO_VARBINARY + ''', Single_Blob) CD_ARQUIVO)' +
                ' WHERE D_GB_FOTOS.ID_FOTO = ' + CONVERT(VARCHAR(10),@ID_FOTO) + ';'  
    PRINT ('ID_FOTO: ' + CONVERT(VARCHAR(10),@ID_FOTO))
    PRINT ('ID_FOTO_MAX: ' + CONVERT(VARCHAR(10),@ID_FOTO_MAX))
    PRINT ('SELECT STATEMENT: ' + @tsql)
    EXEC  (@tsql)
    FETCH NEXT FROM cur INTO @ID_FOTO, @CD_ARQUIVO, @CD_ARQUIVO_VARBINARY
END

CLOSE cur    
DEALLOCATE cur

Пример, из которого я напечатал код выше:

(1 линха афетада) ID_FOTO: 6529 ID_FOTO_MAX: 6531

(1 линха афетада) ID_FOTO: 6530 ID_FOTO_MAX: 6531

(1 линха афетада) ID_FOTO: 6531 ID_FOTO_MAX: 6531

(1 линха афетада) ID_FOTO: 6531 ID_FOTO_MAX: 6531

(1 линха афетада) ID_FOTO: 6531 ID_FOTO_MAX: 6531

1 Ответ

1 голос
/ 17 июня 2020

Вы можете использовать OpenRowSet для чтения изображения с диска и вставки его в свою таблицу

INSERT INTO YourTableName (ID, VarbinaryMaxColumn) VALUES (1, 
    (SELECT * FROM OPENROWSET(BULK N'C:\Temp\Testimage.png', SINGLE_BLOB) AS VarbinaryMaxColumn)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...