5

私の問題は次のとおりです。SQL Server 2008 (> 1GB) のバイナリ (イメージ) フィールドに巨大なファイルが格納される可能性があります。

通常の select ステートメントを使用してバイナリ全体を返すと、クエリが .NET プログラムに結果を返すのに 1 分以上かかり、クライアント アプリがタイムアウトします。私が探しているのは、返されるデータのサイズ (おそらく 300 MB) を制限する TSQL コードです。これにより、残りのチャンクを繰り返し処理し、タイムアウトを防ぐことができます。

これは、データが返された後の処理ではなく、SQL クエリで発生する必要があります。

MSがバイナリデータで動作すると言っているSubStringを試しましたが、返されるのは最大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

OK、わかりました。これを行う方法は、サブストリング関数を使用することです。これは、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としてデータベースに保存する方がはるかに簡単です。プログラムでフォルダを調べて、クライアントにストリーミングする適切なパッケージを見つけるよりも、反対です。

于 2012-12-09T10:28:11.920 に答える
0

FileStream の使用を検討する

ファイルストリームの概要

Win32 を使用した FILESTREAM データの管理

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

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