Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como seleciono apenas uma parte de um binário enorme (arquivo)?


Tudo bem, eu descobri. A maneira de fazer isso é com a função substring, que o MS diz com precisão que funciona com binários. O que eles não dizem é que a substring retornará apenas 8.000 bytes, o que me surpreendeu.

Em outras palavras, se o tipo de dados blob for imagem e você usar isso:
 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)

No entanto, se você declarar uma variável de varbinary(max) e o tipo de dados do campo blob for varbinary(max) - ou algum tamanho que seja útil para você -, use a função substring para trazer de volta o binário parcial para a variável que você declarou. Isso funciona muito bem. Bem assim:
 Declare @PartialImage varbinary(max) 
 select @PartialImage = substring(BlobField, 0, 100000000) --1GB
 from TableWithHugeBlobField
 where ID = SomeIDValue

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

A questão foi colocada anteriormente, por que usar SQL para armazenar dados de arquivos? É uma pergunta válida; imagine que você está tendo que replicar dados como arquivos para centenas de dispositivos clientes diferentes (como iPhones), cada pacote exclusivo do outro porque clientes diferentes têm necessidades diferentes, então armazenar os pacotes de arquivos como blobs em um banco de dados é muito mais fácil de programar contra do que seria cavar programaticamente através de pastas para encontrar o pacote certo para transmitir para o cliente.