2017-08-09 35 views
3

最近我玩了Azure SQL數據庫的新功能for json autoSqlDataReader和SQL Server 2016 FOR JSON以2k字節的塊分割json

當我選擇,例如大量的記錄與此查詢:

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); 

我得到了很多的數據塊。

爲什麼我們有這個限制?爲什麼我們不能把所有東西都放在一個大塊裏?

當我閱讀nvarchar(max)列時,我會將所有內容都放在一個塊中。

感謝解釋

回答

1

Format Query Results as JSON with FOR JSON

的FOR JSON子句

結果集包含單個列的輸出。

一個小的結果集可能包含一行。

一個較大的結果集將長JSON字符串分割成多行。 默認情況下,當輸出設置爲結果爲 網格時,SQL Server Management Studio(SSMS)將結果連接成單行。 SSMS狀態欄顯示實際的行數。

其他客戶端應用程序可能需要代碼才能將冗長的結果重新組合爲單個有效的JSON字符串,方法是連接多行的 內容。有關C# 應用程序中此代碼的示例,請參閱C#客戶端應用程序中的使用FOR JSON輸出。

我會說這是嚴格的性能原因,類似於XML。更SELECT FOR XML AUTO and return datatypesWhat does server side FOR XML return?

在SQL Server 2000的服務器側XML發佈 - FOR XML(見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格式化,並直接將其輸出發送到服務器端的TDS代碼,而不會緩衝服務器空間中的整個XML。塊大小爲2033個UCS-2字符。因此,大於2033個UCS-2字符的XML以多行的形式發送到客戶端,每行包含一個XML塊。 SQL Server爲此行集使用預定義列名,並使用NTEXT類型的一列 - 「XML_F52E2B61-18A1-11d1-B105-00805F49916B」 - 以UTF-16編碼指示分塊的XML行集。這需要API對XML塊行集進行特殊處理,以將其作爲客戶端上的單個XML實例公開。在ADO.Net中,需要使用ExecuteXmlReader,而在ADO/OLEDB中,應該使用ICommandStream接口。