Обновить двоичный файл var в существующие столбцы SQL (Добавить в существующее изображение)? - PullRequest
0 голосов
/ 25 января 2020

у меня есть стол City; Тип моего столбца Pic varbinary(max):

enter image description here

Я обновляю свой столбец pi c этим кодом и работаю (для 1 pi c):

UPDATE City 
SET pic = 0xwed323422222222.... 
WHERE id = 4

но как я могу обновить 3 или более изображений в столбце Pic? (добавить к существующему изображению)

Это значит, что я хранил в таблице where id = 4 только 1 двоичный файл изображения. Как сохранить более 1 изображения в одном столбце?

1 Ответ

1 голос
/ 27 января 2020

Вы можете хранить несколько изображений «полуструктурированным» способом в пределах одного столбца, используя xml (и его структурную целостность). Вы можете изменить тип данных столбца «pi c» на xml или оставить его varbinary (для последнего требуется преобразование типов).

В следующем примере предполагается, что varbinary хранит «изображение» столбец и папка "c: \ testnew" (в экземпляре sql), которая содержит 3 изображения (image [1..3] .png).

Сначала загружаются два изображения для столбца «изображение» cityid = 1, а затем третье изображение добавляется к двоичным данным (первые 2 изображения) с обновлением .write (). Удаление изображений или вставка изображений в определенное c место в BLOB-объекте может быть достигнуто с помощью метода xml .modify ().

Все это, если действительно нужно / нужно хранить несколько изображений в одной строке и столбце.

create table dbo.TestImages
(
    id int identity(1,1) constraint pkidTestImages primary key clustered(id),
    CityId int,
    ImagesBlobXml varbinary(max) --or xml
)
go


--insert two images from folder c:\testnew
insert into dbo.TestImages
(
    CityId, ImagesBlobXml
)

values (
1, 
cast((
select TheImage
from 
(
select *
from openrowset(bulk N'C:\testnew\image1.png', single_blob) as i(TheImage)
union all
select *
from openrowset(bulk N'C:\testnew\image2.png', single_blob) as i(TheImage)
--union all
--select *
--from openrowset(bulk N'C:\testnew\stackoverflow.png', single_blob) as i(TheImage)
) as images
for xml path(''), type
) as varbinary(max))
);

select 'table content', *
from  dbo.TestImages;


--retrieve images (2)
select 'images in blob, initial insert', t.id, t.CityId, i.bin.value('.', 'varbinary(max)') as TheImage
from
(
select *, cast(ImagesBlobXml as xml) as ImagesBlobXmlXML
from dbo.TestImages 
) as t
cross apply t.ImagesBlobXmlXML.nodes('TheImage') as i(bin);


--append new image
update t
set ImagesBlobXml .WRITE( --note:write cannot be used on NULL values
cast((
select TheImage
from 
(
select *
from openrowset(bulk N'C:\testnew\image3.png', single_blob) as i(TheImage)
) as images
for xml path(''), type
) as varbinary(max)) , 
null, 0 --write() append
)
from dbo.TestImages as t
where CityId = 1;


--retrieve the images (3)
select 'images in blob, after update_append', t.id, t.CityId, i.bin.value('.', 'varbinary(max)') as TheImage
from
(
select *, cast(ImagesBlobXml as xml) as ImagesBlobXmlXML
from dbo.TestImages 
) as t
cross apply t.ImagesBlobXmlXML.nodes('TheImage') as i(bin);

--check for any diff
select i.bin.value('.', 'varbinary(max)') as TheImage
from
(
select *, cast(ImagesBlobXml as xml) as ImagesBlobXmlXML
from dbo.TestImages 
) as t
cross apply t.ImagesBlobXmlXML.nodes('TheImage') as i(bin)
except
select TheImage
from 
(
select *
from openrowset(bulk N'C:\testnew\image1.png', single_blob) as i(TheImage)
union all
select *
from openrowset(bulk N'C:\testnew\image2.png', single_blob) as i(TheImage)
union all
select *
from openrowset(bulk N'C:\testnew\image3.png', single_blob) as i(TheImage)
) as images;
go

--cleanup
drop table dbo.TestImages;
go
...