您可以使用
OPENJSON
从 JSON 中提取值,然后使用
UNPIVOT
将这些值重新组织成您所需的格式:
declare @source table (id int, props nvarchar(max))
declare @tmp table (id int, prop1 nvarchar(max), prop2 nvarchar(max))
insert into @source
select 23,'[{"prop1": "value1","prop2": "value2"},{"prop1": "value3","prop2": "value4"}]'
insert into @tmp
select id, prop1,prop2 from @source cross apply OPENJSON(props)
with
(
prop1 nvarchar(100),
prop2 nvarchar(100)
)
select id, u.property, u.value
from @tmp t
unpivot(
[value] for [property] in (prop1,prop2)
) u;
这里是这个 TSQL 片段的输出结果:
如果你不需要中间结果,可以避免使用临时表,在一步中处理数据。
declare @source table (id int, props nvarchar(max))
insert into @source
select 23,'[{"prop1": "value1","prop2": "value2"},{"prop1": "value3","prop2": "value4"}]'
select id, u.property, u.value
from (select id, prop1, prop2 from @source cross apply OPENJSON(props)
with
(
prop1 nvarchar(100),
prop2 nvarchar(100)
)
) t
unpivot(
[value] for [property] in (t.prop1,t.prop2)
) u;
附言:
您发布的JSON数据:
[{"prop1": "value1","prop2": "value2},{"prop1": "value3","prop2": "value4}
由于value2和value4后面缺少最终方括号和几个引号,因此不合法。您可以使用ISJSON()
进行检查,它将返回0:
select isjson(' [{"prop1": "value1","prop2": "value2},{"prop1": "value3","prop2": "value4}')
我假设输入实际上是:
[{"prop1": "value1","prop2": "value2"},{"prop1": "value3","prop2": "value4"}]