使用列名和值作为键值对创建JSON

问题描述 投票:0回答:1

我们必须使用某种格式将数据导出格式设置为JSON。这里是一个测试用例:

DECLARE @tmp TABLE (ID INT, value1 VARCHAR(30), value2 VARCHAR(30))
INSERT @tmp VALUES (1,'test1','test2')

/*
OUTPUT should be:
{
    "ID": 1,
    "custom_attributes": [
        {
            "attribute_code": "value1",
            "value": "test1"
        },
        {
            "attribute_code": "value2",
            "value": "test2"
        }
    ]
}
*/

我们必须为某些列制作两个键值对。第一个描述列名,第二个描述值。然后将其打包成一个数组。

我想知道使用本地t-sql JSON函数是否可行,因为我需要适当的JSON作为输出(而不是字符串)。

sql json sql-server tsql
1个回答
1
投票

您需要使用嵌套的FOR JSON

DECLARE @tmp TABLE(ID INT, value1 VARCHAR(30), value2 VARCHAR(30));
INSERT @tmp VALUES (1, 'test1', 'test2');

SELECT ID, custom_attributes = (
    SELECT attribute_code, value
    FROM @tmp AS x
    -- column to rows
    CROSS APPLY (VALUES
        ('value1', value1),
        ('value2', value2)
    ) AS a(attribute_code, value)
    WHERE x.ID = t.ID
    FOR JSON PATH
)
FROM @tmp AS t
FOR JSON AUTO

0
投票

我找到了一个可能的答案,该方法可行,但似乎有点复杂...

SELECT tmp.ID
,      (
        SELECT ca.attribute_code
        ,      ca.[value]
        FROM @tmp tmp2
        CROSS APPLY (
            VALUES 
                ('value1',value1),
                ('value2',value2)
        ) ca (attribute_code, [value])
        WHERE tmp2.ID = tmp.ID
        FOR JSON PATH
        ) [custom_attributes]
FROM @tmp tmp
FOR JSON PATH
© www.soinside.com 2019 - 2024. All rights reserved.