7

¿Cuál es el tamaño máximo de un archivo que puedo insertar usando varbinary (max) en SQL Server 2008 R2? Traté de cambiar el valor máximo en la columna a más de 8,000 bytes pero no me deja, así que supongo que el máximo es 8,000 bytes, pero de this article on MSDN, dice que el tamaño máximo de almacenamiento es 2^31- 1 bytes:SQL Server 2008 R2 Varbinary Max Size

varbinary [(n | max)]

de longitud variable de datos binarios. n puede ser un valor de 1 a 8,000. max indica que el tamaño de almacenamiento máximo es de 2^31-1 bytes. El tamaño de almacenamiento es la longitud real de los datos ingresados ​​+ 2 bytes. Los datos que se ingresan pueden tener 0 bytes de longitud. El sinónimo ANSI SQL para varbinary es binario que varía.

Entonces, ¿cómo puedo almacenar archivos más grandes en un campo varbinary? No estoy pensando en utilizar un FILESTREAM ya que los archivos que desea guardar son de 200kb a 1mb Max, el código que estoy usando:

UPDATE [table] 
SET file = (SELECT * FROM OPENROWSET (BULK 'C:\A directory\A file.ext', SINGLE BLOB) alias) 
WHERE idRow = 1 

he sido capaz de ejecutar ese código con éxito a los archivos de menos o igual de 8000 bytes. Si intento con un archivo con un tamaño de 8001 bytes, fallará. Mi campo de archivo en la tabla tiene un campo llamado "archivo" tipo varbinary(8000) que como he dicho, no puedo cambiar a un valor mayor.

+1

¿Cómo lo intentó? ¿Puedes mostrar el código que usaste para hacer esto y crear la estructura de la tabla para la tabla? Además, no existe tal cosa como 'nvarbinary'. –

+0

Lo siento, quise decir varbinary (max), también he agregado el código que utilicé, muchas gracias –

+0

¿Has comprobado la configuración del modo de compatibilidad? –

Respuesta

15

No puedo reproducir este escenario. Probé los siguientes:

USE tempdb; 
GO 

CREATE TABLE dbo.blob(col VARBINARY(MAX)); 

INSERT dbo.blob(col) SELECT NULL; 

UPDATE dbo.blob 
    SET col = (SELECT BulkColumn 
    FROM OPENROWSET(BULK 'C:\Folder\File.docx', SINGLE_BLOB) alias 
); 

SELECT DATALENGTH(col) FROM dbo.blob; 

Resultados:

-------- 
39578 

Si esto es conseguir un tope de 8K entonces yo supongo que cualquiera de las siguientes situaciones:

  1. La columna es en realidad VARBINARY(8000).

  2. Está seleccionando los datos en Management Studio y analizando la longitud de los datos que allí se muestran. Esto se limita a un máximo de 8192 caracteres en los resultados al texto, si este es el caso, por lo que usar DATALENGTH() directamente contra la columna es un enfoque mucho mejor.

1

me atrevería a decir, utilizar secuencia de archivo para archivos mayores de 1 MB en base a lo siguiente de: MS TechNet | FILESTREAM Overview.

En SQL Server, BLOB puede ser normalizado de datos que almacena varbinary(max) los datos en tablas, o FILESTREAM varbinary(max) objetos que almacenan los datos en el sistema de archivos. El tamaño y el uso de los datos determina si debe usar el almacenamiento de la base de datos o el almacenamiento del sistema de archivos. Si se cumplen las siguientes condiciones , se debe considerar el uso de FILESTREAM:

  • objetos que están siendo almacenados son, en promedio, más de 1 MB.
  • El acceso de lectura rápida es importante.
  • Está desarrollando aplicaciones que utilizan un nivel medio para la lógica de la aplicación.

Para los objetos más pequeños, el almacenamiento de varbinary(max) BLOB en la base de datos menudo proporciona un mejor rendimiento de streaming.

1

"TEXTSIZE SET" Especifica el tamaño de varchar(max), nvarchar(max), varbinary(max), text, ntext, y datos de imágenes devueltas por una instrucción SELECT.

select @@TEXTSIZE 

El controlador de SQL Server Native Client y el proveedor de SQL Server Native Client OLE DB para SQL Server establece automáticamente TEXTSIZE-2147483647 cuando se conecta. La configuración máxima para SET TEXTSIZE es de 2 gigabytes (GB), especificado en bytes. Una configuración de 0 restablece el tamaño a la predeterminada (4 KB).

Como se mencionó, para archivos grandes, debería preferir la transmisión de archivos.

Cuestiones relacionadas