Как вставить BLOB-объект в базу данных с помощью SQL Server Studio Studio - PullRequest
48 голосов
/ 29 октября 2009

Как мне легко вставить BLOB-объект в поле varbinary(MAX)?

Как пример:

что я хочу вставить: c: \ picture.png
стол mytable
столбец mypictureblob
место указано = 1

Ответы [ 6 ]

64 голосов
/ 29 октября 2009

Вы можете вставить в поле 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, а не к клиенту, выполняющему эту команду.

14 голосов
/ 02 августа 2010

В 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]:
Введите терминатор поля [нет]:

Тогда он спросит:

Хотите сохранить информацию этого формата в файле? [Да / Нет] y
Имя файла хоста [bcp.fmt]: C: \ Test \ bcp_2.fmt

В следующий раз, когда вам нужно будет запустить его, добавьте -f C:\Test\bcp_2.fmt, и он перестанет ныть :-) Экономит много времени и скорби.

6 голосов
/ 06 августа 2012

Существует два способа выбора 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.

Вы также можете использовать вторую версию, чтобы выполнить ОБНОВЛЕНИЕ, как я описал в Как обновить BLOB-объект в СЕРВЕРЕ SQL, используя TSQL .

2 голосов
/ 14 ноября 2012

Однако вы можете просто прочитать файл с диска на компьютере с сервером SQL:

select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a

для просмотра в приложении управления в шестнадцатеричной форме (Management Studio).

Таким образом, вы можете, например, сделать резервную копию базы данных в файл (локально на сервере), а затем загрузить ее в другое место с помощью приведенного выше оператора.

1 голос
/ 29 октября 2009

Вам нужно сделать это из студии 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

0 голосов
/ 29 октября 2009

Хорошо ... это заняло у меня слишком много времени. Инструмент студии sql-management просто не подходит для таких простых вещей (как я заметил раньше, когда искал, где установить время ожидания для запросов, и это было сделано в 4 разных местах)

Я скачал какой-то другой пакет редактора sql (в моем случае sql maestro). И вот он включает в себя редактор BLOB-объектов, где вы можете просматривать BLOB-объекты и загружать новые BLOB-объекты в эти поля.

спасибо за ввод!

...