Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come faccio a selezionare solo una parte di un file binario enorme?

OK, ho capito. Il modo per farlo è con la funzione sottostringa, che secondo MS funziona con i binari. Quello che non dicono è che la sottostringa restituirà solo 8.000 byte, che è ciò che mi ha lanciato.

In altre parole, se il tipo di dati BLOB è immagine e usi questo:

 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 dichiari una variabile di varbinary(max) e il tipo di dati del campo blob è varbinary(max) o una dimensione che ti è utile, 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 in precedenza, perché utilizzare SQL per archiviare i dati dei file? È una domanda valida; immagina di dover replicare i dati come file su centinaia di dispositivi client diversi (come iPhone), ogni pacchetto è unico dall'altro perché client diversi hanno esigenze diverse, quindi archiviare i pacchetti di file come BLOB su un database è molto più facile da programmare contro di quanto sarebbe scavare a livello di codice tra le cartelle per trovare il pacchetto giusto da trasmettere al client.