如何只选择一部分巨大的二进制文件(文件)?

Bri*_*ian 5 sql t-sql sql-server blob sql-server-2008

我的问题是:我有可能将大文件存储在SQL Server 2008上的二进制(图像)字段中(> 1GB).

如果我使用常规select语句返回整个二进制文件,则查询需要一分多钟才能将结果返回到我的.NET程序并且我的客户端应用程序超时.我正在寻找的是TSQL代码,它将限制返回的数据大小(可能是300mb),允许我迭代剩余的块并防止超时.

这必须发生在SQL查询中,而不是在返回数据后的处理中.

我已经尝试过SubString,MS说它可以处理二进制数据,但我得到的最多只有8000字节.我试过的最后一件事看起来像这样:

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

由于客户端应用程序,数据流也不是一个真正的选项.

有任何想法吗?

Bri*_*ian 5

好的,我明白了.这样做的方法是使用子字符串函数,MS准确地说可以使用二进制文件.他们没有说的是子字符串只返回8,000个字节,这就是我扔的东西.

换句话说,如果blob数据类型是image并且你使用它:

 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)
Run Code Online (Sandbox Code Playgroud)

但是,如果声明varbinary(max)变量并且blob字段数据类型是varbinary(max) - 或某些对您有用的大小 - 那么使用substring函数将部分二进制文件带回到您声明的变量中.这很好用.像这样:

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

 select DataLength(@PartialImage) -- should = 1GB
Run Code Online (Sandbox Code Playgroud)

之前提出的问题是,为什么要使用SQL来存储文件数据?这是一个有效的问题; 想象你必须将数据作为文件复制到数百个不同的客户端设备(如iPhone),每个包都是唯一的,因为不同的客户有不同的需求,然后将文件包作为blob存储在数据库上要容易编程反对以编程方式挖掘文件夹以找到正确的包流出到客户端.

  • 对于子字符串,第一个字节为1而不是0. (2认同)

pap*_*zzo 0

考虑使用文件流

文件流概述

使用 Win32 管理 FILESTREAM 数据

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

numBytes = sqlFileStream.Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)