5

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

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

有任何想法吗?

4

3 回答 3

5

好的,我想通了。做到这一点的方法是使用 substring 函数,MS 准确地说它适用于二进制文件。他们没有说的是 substring 只会返回 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 存储在数据库上更容易编程与以编程方式挖掘文件夹以找到正确的包以流式传输到客户端相比。

于 2012-12-09T10:28:11.920 回答
1

用这个:

select substring(*cast(Package as varbinary(max))*,0,300000000) 'package', ID  
from rplPackage 
where ID=0
于 2016-01-21T06:30:28.950 回答
0

考虑使用 FileStream

文件流概述

使用 Win32 管理 FILESTREAM 数据

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

numBytes = sqlFileStream.Read(buffer, 0, buffer.Length);
于 2012-12-08T14:30:00.453 回答