【问题标题】:return data and count as json toghether返回数据并一起计为json
【发布时间】:2017-07-01 03:05:35
【问题描述】:

考虑下表:

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

我需要 Id

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 中使用 1 选择和仅往返于 db 来创建该 json?

【问题讨论】:

  • 您不需要查询页面变量。只需将计算字段投影到结果集即可。

标签: sql sql-server json sql-server-2016


【解决方案1】:

这行得通……是不是你所追求的还不清楚。

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  
    MyCount=@MyFilterCount
    ,* 
FROM 
    @X

【讨论】:

  • 谢谢,我需要检查一下,然后我可以在这里通知您。
  • 它返回这个[{"MyCount":3,"Id":1},{"MyCount":3,"Id":2},{"MyCount":3,"Id":3}] 这显然不同于{"MyCount":3, data: [{"Id":1},{"Id":2},{"Id":3}]}
  • 我添加了答案。
【解决方案2】:

我找到了解决办法。

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'}]
}

【讨论】:

  • Limit 不是标准的 Sql Server 语法。您没有收到错误消息?
  • 是的,你是对的。完整(但复杂)的答案是select * from (select '#metadata/cities' as '@odata.context', (select count_big(1) from bit.Cities where Name like '%1%') as '@odata.count', (select * from bit.Cities where Name like '%1%' order by Id asc offset 0 rows fetch next 10 rows only for json path) as 'value') as ODataResult for json auto, without_array_wrapper
  • 这会导致{"@odata.context":"#metadata\/cities","@odata.count":3000,"value":[{"Id":"95ADC4B9-120E-4BDB-ABB7-000179B1F40B","Name":"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" 为 dot 创建嵌套对象。因此,我将第一个结果包装在名为“ODataResult”的派生表中,然后用于 json“auto”,它不会像那样改变结果。奇迹般有效! (-:
  • bit.cities 表脚本:CREATE TABLE [bit].[Cities]( [Id] [uniqueidentifier] NOT NULL, [Name] [nvarchar](max) NULL, [ProvinceId] [uniqueidentifier] NOT NULL)
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多