2017-07-01 55 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

我添加了答案。 –