Как вставить BLOB-объект в базу данных с помощью SQL Server Studio Studio
Как я могу легко вставить BLOB-объект в поле varbinary(MAX)?
ради аргумента:
предположим, что я хочу вставить следующее: c:\picture.png таблица mytable, столбец mypictureblob и место recid=1
Я давно гуглю и не могу найти простое решение
Спасибо!
6 ответов
Вы можете вставить в поле varbinary(max), используя T-SQL в SQL Server Management Studio и, в частности, используя команду OPENROWSET.
Например:
INSERT Production.ProductPhoto
(
ThumbnailPhoto,
ThumbnailPhotoFilePath,
LargePhoto,
LargePhotoFilePath
)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET
(BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto
Посмотрите на следующую документацию для хорошего примера / прохождения
Работа с типами больших значений
Обратите внимание, что путь к файлу в этом случае относится к целевому серверу SQL, а не к клиенту, выполняющему эту команду.
В MSDN есть статья " Работа с типами больших значений", которая пытается объяснить, как работают импортируемые части, но это может немного запутать, поскольку одновременно выполняет две вещи.
Здесь я предоставляю упрощенную версию, разбитую на 2 части. Предположим следующую простую таблицу:
CREATE TABLE [Thumbnail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED
(
[Id] ASC
) ) ON [PRIMARY]
Если вы запускаете (в SSMS):
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
это покажет, что результат выглядит как таблица с одним столбцом с именем BulkColumn
, Вот почему вы можете использовать его в INSERT, как:
INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
Остальное просто помещает его во вставку с большим количеством столбцов, которые ваша таблица может иметь или не иметь. Если вы назовете результат этого select FOO
тогда вы можете использовать SELECT Foo.BulkColumn
а также as
после этого константы для других полей в вашей таблице.
Часть, которая может стать более сложной, состоит в том, как экспортировать эти данные обратно в файл, чтобы вы могли проверить, все ли в порядке. Если вы запустите его в строке cmd:
bcp "select Data from B2B.dbo.Thumbnail where Id=1"
queryout D:\T\TestImage1_out2.dds -T -L 1
Он начнет скулить для 4 дополнительных "параметров" и даст вводящие в заблуждение значения по умолчанию (что приведет к изменению файла). Вы можете принять первый, установить 2-й в 0 и затем собрать 3-й и 4-й, или быть явно:
Введите тип хранилища файлов в поле Data [varbinary(max)]:
Введите префикс-длину поля данных [8]: 0
Введите длину поля данных [0]:
Введите терминатор поля [нет]:
Тогда он спросит:
Вы хотите сохранить информацию этого формата в файл? [Да / Нет] у
Имя файла хоста [bcp.fmt]: C:\Test\bcp_2.fmt
В следующий раз вы должны запустить его добавить -f C:\Test\bcp_2.fmt
и он перестанет ныть:-) Экономит много времени и скорби.
Есть два способа ВЫБРАТЬ BLOB с помощью TSQL:
SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
Так же как:
SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
Обратите внимание на имя корреляции после предложения FROM, которое является обязательным.
Затем вы можете это вставить, выполнив команду INSERT SELECT.
Вы также можете использовать вторую версию, чтобы выполнить ОБНОВЛЕНИЕ, как я описал в разделе Как обновить большой двоичный объект в SQL SERVER с помощью TSQL.
Однако вы можете просто прочитать файл с диска на компьютере с сервером SQL:
select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a
увидеть его в приложении управления в шестнадцатеричном виде (Management Studio).
Таким образом, вы можете, например, сделать резервную копию базы данных в файл (локально на сервере), а затем загрузить ее в другое место с помощью инструкции выше.
Вам нужно сделать это из студии mgmt? Вот как мы это делаем из строки cmd:
"C: \ Program Files \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe" / S <Сервер> /D <База данных> /T mytable /C mypictureblob /F "C:\picture.png" /W", где RecId=" /I
Хорошо... это заняло у меня слишком много времени. Инструмент студии sql-management просто не подходит для таких простых вещей (как я заметил раньше, когда искал, где установить время ожидания для запросов, и это было сделано в 4 разных местах)
Я скачал какой-то другой пакет редактора sql (в моем случае sql maestro). И вот, он включает в себя редактор BLOB-объектов, где вы можете просматривать BLOB-объекты и загружать новые BLOB-объекты в эти области.
спасибо за вклад!