2017-08-09 6 views
3

最近、Azure SQLデータベースの新しいfor json auto機能を使用しました。その後、SqlDataReaderとSQL Server 2016 JSONがjsonを2kバイトの塊で分割します

Select 
    Wiki.WikiId 
    , Wiki.WikiText 
    , Wiki.Title 
    , Wiki.CreatedOn 
    , Tags.TagId 
    , Tags.TagText 
    , Tags.CreatedOn 
From 
    Wiki 
Left Join 
    (WikiTag 
Inner Join 
    Tag as Tags on WikiTag.TagId = Tags.TagId) on Wiki.WikiId = WikiTag.WikiId 
For Json Auto 

とC#SqlDataReaderで選択を行います:

私はこのクエリを使用して、たとえば、レコードの多くを選択

var connectionString = ""; // connection string 
var sql = ""; // query from above 
var chunks = new List<string>(); 

using (var connection = new SqlConnection(connectionString)) 
using (var command = connection.CreateCommand()) { 
    command.CommandText = sql; 
    connection.Open(); 

    var reader = command.ExecuteReader(); 

    while (reader.Read()) { 
      chunks.Add(reader.GetString(0)); // Reads in chunks of ~2K Bytes 
    } 
} 

var json = string.Concat(chunks); 

私は、データのチャンクの多くを得ます。

なぜこの制限がありますか?すべてのものを1つの大きなチャンクで取得してみませんか?

nvarchar(max)の列を読むと、すべてが1つのチャンクになります。 Format Query Results as JSON with FOR JSONから説明

答えて

1

ため

ありがとう:FOR JSON句の

出力

結果セットが単一の列が含まれています。

小さい結果セットには1つの行が含まれることがあります。

大きな結果セットは、長いJSON文字列を複数の行に分割します。 既定では、出力設定が グリッドの場合、SQL Server Management Studio(SSMS)は結果を単一の行に連結します。 SSMSステータスバーには実際の行数が表示されます。

の複数行の内容を連結することによって、他のクライアントアプリケーションで長い結果を単一の有効なJSON文字列に再結合するコードが必要な場合があります。 C# アプリケーションのこのコードの例については、C#クライアントアプリケーションでのJSON出力の使用を参照してください。

XMLと同じようにパフォーマンス上の理由から厳密に言えます。よりSELECT FOR XML AUTO and return datatypesWhat does server side FOR XML return?

SQL Server 2000では、サーバー側のXMLパブリッシング - XML FORは(http://msdn2.microsoft.com/en-us/library/ms178107(SQL.90).aspx参照) - クエリ・プロセッサと、データトランスポート層との間のコードの層で実施されました。 FOR XMLを使用しない場合、SELECTクエリはクエリプロセッサによって実行され、結果の行セットはサーバー側TDSコードによってクライアント側に送信されます。 SELECTステートメントにFOR XMLが含まれている場合、クエリプロセッサはFOR XMLなしの場合と同じ方法で結果を生成し、FOR XMLコードでは行セットをXMLとしてフォーマットします。 最大限のXMLパブリッシングパフォーマンスFOR XMLは、結果として得られる行セットのXMLフォーマットをスティミングし、その出力をサーバースペース内のXML全体をバッファリングせずに、小さなチャンクで直接サーバー側のTDSコードに送信します。チャンクサイズは2033 UCS-2文字です。したがって、2033を超えるUCS-2文字を含むXMLは、それぞれXMLのチャンクを含む複数の行でクライアント側に送信されます。 SQL Serverは、この行セットの定義済みの列名を使用して、NTEXT型の1つの列( "XML_F52E2B61-18A1-11d1-B105-00805F49916B")を使用して、UTF-16エンコーディングでチャンクされたXML行セットを示します。これは、クライアントサイドで単一のXMLインスタンスとして公開するために、XMLチャンク行セットをAPIで特別に処理する必要があります。 ADO.NetではExecuteXmlReaderを使用する必要があり、ADO/OLEDBではICommandStreamインターフェイスを使用する必要があります。

関連する問題