2017-07-01 84 views
0

考慮下表:返回數據,並計算爲JSON toghether

[Id: 1, Name: "A1"], [Id: 2, Name: "A2"], ... [Id: 100, Name: "A100"] 

我需要標識< = 50的數據,分頁。所以我寫

select * 
from data 
where Id <= 50 order by Id 0 rows fetch next 10 rows only 

然後我執行另一個查詢

select count(1) 
from data 
where Id <= 50 

然後,我喜歡這個返回JSON客戶

{ 
    count:50, 
    values:[{Id:1, Name:'A1'}, ..., {Id:10,Name:'A10'}] 
} 

如何創建使用在SQL Server 2016 JSON 1選擇和往返數據庫只?

+0

你並不需要爲您的頁面變量的查詢。只需將計算字段投影到結果集上即可。 –

回答

0

我找到了解決方案。

select (select count(1) from data where Id <= 50) as total, 
(select * from data where Id <= 50 order by Id 0 rows fetch next 10 rows only FOR JSON PATH) as values 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 

它導致成

{ 
    count:50, 
    values:[{Id:1, Name:'A1'}, ..., {Id:10,Name:'A10'}] 
} 
+1

限制不是標準的Sql Server語法。你沒有得到一個錯誤? –

+0

是的,你說得對。完整(但複雜)的答案是'''select * from(選擇'#metadata/cities'as'@ odata.context', \t \t \t(select count_big(1)from bit.Cities其中Name'%1 %''作爲'@ odata.count', \t \t \t(select * from bit.Cities其中,名稱類似於'%1%'按ID排序,偏移0行,僅爲json路徑提取下10行)爲'value' )odataResult for json auto,without_array_wrapper''' –

+0

其結果爲'''「@ odata.context」:「#metadata \/cities」,「@ odata.count」:3000,「value」:[{ 「ID」: 「95ADC4B9-120E-4BDB-ABB7-000179B1F40B」, 「姓名」: 「City14792」, 「ProvinceId」: 「2F013E2C-913E-40D4-9A2A-4F7905B5D440」},...,{ 「ID」: 「F239515A-2C4B-41BA-9503-00274638BDC9」,「Name」:「City11372」,「ProvinceId」:「2F013E2C-913E-40D4-9A2A-4F7905B5D440」}]}正如你所能看,那裏有一個@ odata.context列名。 json「path」爲點創建嵌套對象。 因此,我將第一個結果包裝在名爲「ODataResult」的派生表中,然後用於不改變結果的json「auto」。奇蹟般有效! ( - : –

0

這是有效的......這是你以後不清楚。

DECLARE @X TABLE(Id INT) 
INSERT @X SELECT 1 
INSERT @X SELECT 2 
INSERT @X SELECT 3 

SELECT 
    * 
FROM 
    @X 
    INNER JOIN(SELECT YourCount=COUNT(*) FROM @X)AS X ON 1=1 

當過濾條件已知時,這裏更有效。

DECLARE @X TABLE(Id INT) 
INSERT @X SELECT 1 
INSERT @X SELECT 2 
INSERT @X SELECT 3 


DECLARE @MyFilterCount INT = (SELECT COUNT(*) FROM @X WHERE 1=1) 

SELECT 
    [email protected] 
    ,* 
FROM 
    @X 
+0

謝謝,我需要檢查一下,然後我可以在這裏通知你。 –

+0

它返回此'''[{「MyCount」:3,「Id」:1},{「MyCount」:3,「Id」:2},{「MyCount」:3,「Id」:3}] '''這與「'」MyCount「明顯不同:3,data:[{」Id「:1},{」Id「:2},{」Id「:3}]}''' –

+0

我添加了答案。 –