Я хотел бы хранить большие изображения на 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
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