Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie wähle ich nur einen Teil einer riesigen Binärdatei (Datei) aus?

Okay, ich habe es herausgefunden. Der Weg, dies zu tun, ist mit der substring-Funktion, von der MS genau sagt, dass sie mit Binärdateien funktioniert. Was sie nicht sagen, ist, dass die Teilzeichenfolge nur 8.000 Bytes zurückgibt, was mich geworfen hat.

Mit anderen Worten, wenn der Blob-Datentyp Bild ist und Sie dies verwenden:

 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)

Wenn Sie jedoch eine Variable von varbinary(max) deklarieren und der Datentyp des Blob-Felds varbinary(max) ist – oder eine für Sie nützliche Größe –, verwenden Sie die Funktion substring, um die partielle Binärdatei in die deklarierte Variable zurückzubringen. Das funktioniert gut. Einfach so:

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

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

Die Frage wurde zuvor gestellt, warum SQL zum Speichern von Dateidaten verwendet werden sollte? Es ist eine berechtigte Frage; Stellen Sie sich vor, Sie müssten Daten als Dateien auf Hunderte von verschiedenen Client-Geräten (wie iPhones) replizieren, wobei jedes Paket einzigartig ist, da verschiedene Clients unterschiedliche Anforderungen haben. Dann ist das Speichern der Dateipakete als Blobs in einer Datenbank viel einfacher zu programmieren dagegen wäre es, Ordner programmgesteuert zu durchsuchen, um das richtige Paket zum Streamen an den Client zu finden.