【问题标题】:Use the new SQL Server 2016 FOR JSON PATH statement in a T-SQL query and return multiple rows (or resultsets) of JSON在 T-SQL 查询中使用新的 SQL Server 2016 FOR JSON PATH 语句并返回 JSON 的多行(或结果集)
【发布时间】:2020-02-25 01:13:12
【问题描述】:

我已经设置了一个类似于这个 sqlfiddle 的查询

http://sqlfiddle.com/#!18/402f6/4

它返回单个 JSON(SQL Server 2016+ 中提供的一项功能)列。

如您所想,我将 JSON 发布到 Web API 端点。

但是,Web API 端点将每个请求可以提交的“行”数限制为 25。

因此,在我的示例中,我希望返回 4 行 JSON 或 4 个 JSON 结果集,而不是返回 1 行包含 100 条记录的 JSON。

可以吗?它需要如何重构才能做到这一点?

【问题讨论】:

  • 小提琴很好,但您需要在问题中发布足够的代码以使其独立。
  • 您正在返回一个 Json 数组。您是否能够在代码中将其反序列化为列表?您是否严格需要在 SQL 中执行此操作?
  • @DaleBurrell,抱歉,我不关注。
  • @ZeinSleiman,现在我被告知只使用 sql 中的 json 提取。我要求反序列化为 pocos,但被否决了。不过,这是个好问题。
  • 请更新您的问题以包含理解您的问题所需的最少代码(例如,如果 sqlfiddle 站点已关闭)。

标签: c# sql json sql-server


【解决方案1】:

您可以使用NTILE()FOR JSON PATH 尝试以下方法:

声明:

;WITH cte AS (
   SELECT 
      id AS [StudentID], 
      first_name as [FirstName], 
      last_name as [LastName], 
      email as [Email], 
      gender as [Gender],
      NTILE(4) OVER (ORDER BY id) AS GroupID
   FROM TestData
)
SELECT
   DISTINCT t1.GroupID,
   t2.Json
FROM cte t1
CROSS APPLY (
   SELECT StudentID, FirstName, Email, Gender
   FROM cte
   WHERE GroupID = t1.GroupID
   FOR JSON PATH
) t2 (Json)

结果(使用您的测试数据):

GroupID Json
1       [{"StudentID":1,"FirstName":"Myrtie","Email":"mgunning0@bandcamp.com","Gender":"Female"}, ... ,{"StudentID":25,"FirstName":"Dante","Email":"dtoopeo@chronoengine.com","Gender":"Male"}]
2       [{"StudentID":26,"FirstName":"Hamilton","Email":"hginnanep@joomla.org","Gender":"Male"}, ... ,{"StudentID":50,"FirstName":"Enrika","Email":"ehayselden1d@weibo.com","Gender":"Female"}]
3       [{"StudentID":51,"FirstName":"Cirilo","Email":"cfrankcomb1e@blogspot.com","Gender":"Male"}, ...  ,{"StudentID":75,"FirstName":"Zeke","Email":"zleal22@eepurl.com","Gender":"Male"}]
4       [{"StudentID":76,"FirstName":"Todd","Email":"tscandred23@who.int","Gender":"Male"}, ...  ,{"StudentID":100,"FirstName":"Kristi","Email":"kpossek2r@wikispaces.com","Gender":"Female"}]

【讨论】:

  • Zhorov,完美……正是我在寻找的。不熟悉 NTILE 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多