首页 > 解决方案 > 将每个表行导出到 SQL Server 中的 JSON 文件

问题描述

我有一个名为 LineItems 的表,如下所示:

CREATE TABLE [dbo].[LineItems] 
(
    [Id]        BIGINT IDENTITY (1, 1) NOT NULL,
    [Name]      NVARCHAR(255) NULL,
    [StartDate] DATETIME2(7) NULL,
    [EndDate]   DATETIME2(7) NULL,
    [Status]    TINYINT DEFAULT (CONVERT([tinyint], (0))) NOT NULL,
);

我需要将此表中的每一行导出到单个 JSON 文件 ({id}.json)。我已经尝试过FOR JSONSQL Server 支持的子句(使用 FOR JSON 将查询结果格式化为 JSON)。

询问

SELECT TOP 3   
    Id,  
    [Name],  
    StartDate,  
    EndDate,
    [Status]
FROM 
    [dbo].[LineItems]  
FOR JSON PATH

结果

[{
    "Id": 1,
    "Name": "line item 1",
    "StartDate": "2021-01-19T00:00:00",
    "EndDate": "2021-01-22T00:00:00",
    "Status": 0
}, {
    "Id": 2,
    "Name": "line item 2",
    "StartDate": "2021-02-02T00:00:00",
    "EndDate": "2021-02-03T00:00:00",
    "Status": 1
}, {
    "Id": 3,
    "Name": "line item 3",
    "StartDate": "2021-02-21T00:00:00",
    "EndDate": "2021-02-23T00:00:00",
    "Status": 0
}]

问题是输出是一个文件中的多行。我找不到为每一行获取单个 JSON 文件的方法。 所需的结果文件示例是:

1.json

{
    "Id": 1,
    "Name": "line item 1",
    "StartDate": "2021-01-19T00:00:00",
    "EndDate": "2021-01-22T00:00:00",
    "Status": 0
}

2.json

{
    "Id": 2,
    "Name": "line item 2",
    "StartDate": "2021-02-02T00:00:00",
    "EndDate": "2021-02-03T00:00:00",
    "Status": 1
}

3.json

{
    "Id": 3,
    "Name": "line item 3",
    "StartDate": "2021-02-21T00:00:00",
    "EndDate": "2021-02-23T00:00:00",
    "Status": 0
}

标签: sqljsonsql-servertsql

解决方案


您可以转换当前查询以便嵌套在OPENJSON函数中,例如

SELECT CONCAT(JSON_VALUE([value],'$.Id'),'.JSON') AS [file], [value] 
  FROM OPENJSON(
                (SELECT TOP 3 * FROM [dbo].[LineItems] FOR JSON PATH)
                )

Demo

whereJSON_VALUE([value],'$.Id')用于提取Id值,如果需要单独选择以获取相关文件的名称。


推荐阅读