В 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
, и он перестанет ныть :-)
Экономит много времени и скорби.