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

时间:2012-12-08 13:19:26

标签: sql sql-server sql-server-2008 tsql blob

我的问题是:我有可能将大文件存储在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

由于客户端应用程序,数据流也不是一种选择。

有什么想法吗?

3 个答案:

答案 0 :(得分: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)

但是,如果声明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

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

答案 1 :(得分:1)

使用此:

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

答案 2 :(得分:0)

考虑使用FileStream

FILESTREAM Overview

Managing FILESTREAM Data by Using Win32

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

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