7

Qual è la dimensione massima di un file che posso inserire utilizzando varbinary (max) in SQL Server 2008 R2? Ho provato a cambiare il valore massimo nella colonna a più di 8000 byte ma non me lo consente, quindi suppongo che il massimo sia 8.000 byte, ma da this article on MSDN, dice che la dimensione massima di archiviazione è 2^31- 1 byte:SQL Server 2008 R2 Dimensione massima varbinary

varbinary [(n | max)]

lunghezza variabile dati binari. n può essere un valore compreso tra 1 e 8.000. max indica che la dimensione massima della memoria è 2^31-1 byte. La dimensione della memoria è la lunghezza effettiva dei dati inseriti + 2 byte. I dati inseriti possono essere 0 byte di lunghezza. Il sinonimo ANSI SQL per varbinary è binario variabile.

Quindi, come posso archiviare file più grandi in un campo varbinary? Non sto considerando se usare un FILESTREAM dal momento che i file che voglio salvare sono da 200kb a 1MB max, Il codice sto usando:

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

sono stato in grado di eseguire il codice con successo per i file minore o uguale di 8000 byte. Se provo con un file 8001 byte, fallirà. Il mio campo file sul tavolo ha un campo chiamato "file" tipo varbinary(8000) che come ho detto, non posso cambiare ad un valore più grande.

+1

Come hai provato? Puoi mostrare il codice che hai usato per fare questo e creare la struttura della tabella per il tavolo? Inoltre non esiste una cosa come 'nvarbinary'. –

+0

Mi spiace volevo dire varbinary (max), ho anche aggiunto il codice che ho usato, grazie mille –

+0

Hai controllato le impostazioni della modalità di compatibilità? –

risposta

15

Non riesco a riprodurre questo scenario. Ho provato le seguenti:

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; 

Risultati:

-------- 
39578 

Se questo è sempre limitato a 8K, allora direi che o una delle seguenti condizioni:

  1. La colonna è in realtà VARBINARY(8000).

  2. Si stanno selezionando i dati in Management Studio e si analizza la lunghezza dei dati visualizzati. Questo è limitato a un massimo di 8192 caratteri nei risultati del testo, se questo è il caso, quindi usare DATALENGTH() direttamente contro la colonna è un approccio molto migliore.

1

oserei dire, usare flusso di file per i file più grandi di 1 MB in base alla seguente da: MS TechNet | FILESTREAM Overview.

In SQL Server, BLOB può essere standard di dati che memorizza varbinary(max) i dati in tabelle o FILESTREAM varbinary(max) oggetti che memorizzano i dati nel file system. La dimensione e l'uso dei dati determinano se è necessario utilizzare l'archiviazione del database o l'archiviazione del file system. Se le seguenti condizioni sono vere, è consigliabile utilizzare FILESTREAM:

  • oggetti che vengono memorizzati sono, in media, più grandi di 1 MB.
  • L'accesso rapido alla lettura è importante.
  • Si stanno sviluppando applicazioni che utilizzano un livello intermedio per la logica dell'applicazione.

Per gli oggetti più piccoli, la memorizzazione varbinary(max) BLOB nel database spesso fornisce una migliore performance di streaming.

1

"SET TEXTSIZE" Specifica la dimensione di varchar(max), nvarchar(max), varbinary(max), text, ntext, ei dati di immagine restituiti da una dichiarazione SELECT.

select @@TEXTSIZE 

Il driver di SQL Server Native Client ODBC e SQL Server Native Client provider OLE DB per SQL Server impostato automaticamente TEXTSIZE-2147483647 durante la connessione. L'impostazione massima per SET TEXTSIZE è 2 gigabyte (GB), specificata in byte. Un'impostazione di 0 reimposta la dimensione sul valore predefinito (4 KB).

Come già detto, per i file di grandi dimensioni è preferibile lo streaming di file.

Problemi correlati