Solución:
Puede insertar en un campo varbinary (max) usando T-SQL dentro de SQL Server Management Studio y, en particular, usando el comando OPENROWSET.
Por ejemplo:
INSERT Production.ProductPhoto
(
ThumbnailPhoto,
ThumbnailPhotoFilePath,
LargePhoto,
LargePhotoFilePath
)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET
(BULK 'c:imagestricycle.jpg', SINGLE_BLOB) ThumbnailPhoto
Eche un vistazo a la siguiente documentación para ver un buen ejemplo / tutorial
Trabajar con tipos de gran valor
Tenga en cuenta que la ruta del archivo en este caso es relativa al servidor SQL de destino y no a su cliente que ejecuta este comando.
MSDN tiene un artículo Trabajando con tipos de valor grande, que intenta explicar cómo funcionan las partes de importación, pero puede resultar un poco confuso ya que hace 2 cosas simultáneamente.
Aquí proporciono una versión simplificada, dividida en 2 partes. Suponga la siguiente tabla simple:
CREATE TABLE [Thumbnail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED
(
[Id] ASC
) ) ON [PRIMARY]
Si ejecuta (en SSMS):
SELECT * FROM OPENROWSET (BULK 'C:TestTestPic1.jpg', SINGLE_BLOB) AS X
mostrará que el resultado parece una tabla con una columna llamada BulkColumn
. Es por eso que puede usarlo en INSERT como:
INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:TestTestPic1.jpg', SINGLE_BLOB) AS X
El resto es simplemente encajarlo en un inserto con más columnas, que su tabla puede tener o no. Si nombras el resultado de eso select FOO
entonces puedes usar SELECT Foo.BulkColumn
y as
después de eso, constantes para otros campos en su tabla.
La parte que puede volverse más complicada es cómo exportar esos datos nuevamente a un archivo para que pueda verificar que aún está bien. Si lo ejecuta en la línea cmd:
bcp "select Data from B2B.dbo.Thumbnail where Id=1"
queryout D:TTestImage1_out2.dds -T -L 1
Comenzará a quejarse por 4 “parámetros” adicionales y dará valores predeterminados engañosos (que darán como resultado un archivo modificado). Puede aceptar el primero, establecer el segundo en 0 y luego agregar el tercero y cuarto, o para ser explícito:
Ingrese el tipo de almacenamiento de archivos del campo Datos [varbinary(max)]:
Ingrese la longitud del prefijo de los datos del campo [8]: 0
Ingrese la longitud del campo Datos [0]:
Introduzca terminador de campo [none]:
Entonces preguntará:
¿Desea guardar esta información de formato en un archivo? [Y/n] y
Nombre de archivo de host [bcp.fmt]: C: Prueba bcp_2.fmt
La próxima vez que tenga que ejecutarlo, agregue -f C:Testbcp_2.fmt
y dejará de lloriquear 🙂 Ahorra mucho tiempo y dolor.
Hay dos formas de SELECCIONAR un BLOB con TSQL:
SELECT * FROM OPENROWSET (BULK 'C:TestTest1.pdf', SINGLE_BLOB) a
Al igual que:
SELECT BulkColumn FROM OPENROWSET (BULK 'C:TestTest1.pdf', SINGLE_BLOB) a
Tenga en cuenta el nombre de la correlación después de la cláusula FROM, que es obligatoria.
A continuación, puede insertarlo haciendo un INSERT SELECT.
También puede usar la segunda versión para hacer una ACTUALIZACIÓN como describí en Cómo actualizar un BLOB en SQL SERVER usando TSQL.