2012-12-08 18 views
5

Il mio problema è questo: ho il potenziale per l'archiviazione di file enormi in un campo binario (immagine) su SQL Server 2008 (> 1 GB).Come seleziono solo una porzione di enorme binario (file)?

Se restituisco l'intero binario utilizzando un'istruzione di selezione regolare, la query impiega più di un minuto per restituire i risultati al mio programma .NET e le mie app client scadono. Quello che sto cercando è il codice TSQL che limiterà la dimensione dei dati restituiti (forse 300mb), permettendomi di scorrere i restanti blocchi e prevenire i timeout.

Questo deve accadere nella query SQL, non nell'elaborazione dopo che i dati sono stati restituiti.

Ho provato SubString, che MS dice funziona con dati binari, ma tutto quello che ottengo è 8000 byte al massimo. L'ultima cosa che ho provato è stata questa:

select substring(Package,0,300000000) 'package', ID from rplPackage where ID=0 
--where package is the huge binary stored in a image field 

Data Streaming non è davvero un'opzione, a causa delle app client.

Qualche idea?

+0

Si dovrebbe reecaluate, se memorizzare i file come base di dati BLOB si adatta davvero alle vostre esigenze: Potrebbe essere solo meglio stroe i file come file e memorizzare solo il loro percorso e metadati nel DB . Una regola empirica è: se il DB non "capisce" il ** contenuto ** del file, considera di spostarlo. –

+0

@EugenRieck Andiamo, dall'argomento capito non dovrebbe esserci nemmeno un tipo di dati binari. – Paparazzi

+0

Ci sono alcuni casi d'uso (Think FS's shared FS), ma l'OQ mostra abbastanza chiaramente che un BLOB non è una soluzione perfetta qui –

risposta

0

considerare l'utilizzo di FileStream

FILESTREAM Overview

Managing FILESTREAM Data by Using Win32

sqlFileStream.Seek(0L, SeekOrigin.Begin); 

numBytes = sqlFileStream.Read(buffer, 0, buffer.Length); 
+0

Blam ... grazie per l'input. Domani darò un'occhiata a quel lunedì e vedrò se funzionerà per me. Sono disperato a questo punto. – Brian

+0

Scusa, Blam, ma non funzionerà. Non sto leggendo dal file system.I file sono stati archiviati come record nel database per semplificare la replica dei dati verso le app client. Lo streaming non funzionerà, come ho detto sopra. La soluzione deve essere all'interno di TSQL. – Brian

5

OK, ho capito. Il modo per farlo è con la funzione substring, che MS dice con precisione funziona con i binari. Quello che non dicono è che la sottostringa restituirà solo 8.000 byte, che è quello che mi ha gettato.

In altre parole, se il tipo di dati blob è l'immagine e si utilizza in questo modo:

select substring(BlobField,0,100000000) 
from TableWithHugeBlobField 
where ID = SomeIDValue 

--all you'll get is the first 8K bytes (use DataLength function to get the size) 

Tuttavia, se si dichiara una variabile di varbinary (max) e il tipo di dati di campo blob è varbinary (max) - o alcune dimensioni che sono utili per te - quindi usa la funzione substring per riportare il binario parziale nella variabile che hai dichiarato. Questo funziona bene. Proprio così:

Declare @PartialImage varbinary(max) 
select @PartialImage = substring(BlobField, 0, 100000000) --1GB 
from TableWithHugeBlobField 
where ID = SomeIDValue 

select DataLength(@PartialImage) -- should = 1GB 

La domanda è stata posta prima, perché usare SQL per memorizzare i dati dei file? È una domanda valida; immagina di dover replicare i dati come file su centinaia di diversi dispositivi client (come gli iPhone), ogni pacchetto unico dall'altro perché i diversi client hanno esigenze diverse, quindi memorizzare i pacchetti di file come BLOB in un database è molto più facile da programmare contro di quanto sarebbe per scavare programmaticamente attraverso le cartelle per trovare il pacchetto giusto da trasmettere al client.

+2

Per la sottostringa, il primo byte è 1 non 0. – DavidsAlias

1

Utilizzare questa:

select substring(*cast(Package as varbinary(max))*,0,300000000) 'package', ID 
from rplPackage 
where ID=0 
+0

Lasciare un commento per spiegare come la risposta sopra riportata è vantaggiosa per l'OP e per eventuali futuri visitatori. – SnareChops

Problemi correlati