Sql 从多个列的嵌套数组中提取数据

Sql 从多个列的嵌套数组中提取数据,sql,json,sql-server,Sql,Json,Sql Server,我正在使用SQL Server 2016,希望从阵列中提取数据 但是我被卡住了 DECLARE@idvalue NVARCHAR(MAX)='[{“testId”:“b29b2327-527c-456d-8346-6bd22d198f21”,“testValue”:“FAILURE”,“test”:“b29b2327-527c-456d-8346-6bd22d198f21:FAILURE”,“testStartTimestamp”:“2020-06-25T09:22:17.299Z”} ,{te

我正在使用SQL Server 2016,希望从阵列中提取数据

但是我被卡住了

DECLARE@idvalue NVARCHAR(MAX)='[{“testId”:“b29b2327-527c-456d-8346-6bd22d198f21”,“testValue”:“FAILURE”,“test”:“b29b2327-527c-456d-8346-6bd22d198f21:FAILURE”,“testStartTimestamp”:“2020-06-25T09:22:17.299Z”}
,{testId:“4674bc9c-9551-496b-b488-8e138a4dc459”,“testValue:“FAILURE”,“test:“4674bc9c-9551-496b-b488-8e138a4dc459:FAILURE”,“testStartTimestamp:“2020-06-25T09:22:17.299Z”},{“testId:“38c20ac5-dbb7-43ad-b139-f8fde13d0ea5”,“testValue:“FAILURE”,“testValue:“testValue:“FAILURE”,“test:“test:”38c20ac5-dbb7-b139-FDE1430TAMP:“test:”test:“test:“test:“test:“test:”{“testId:“4a3b3102-d3fa-4c2c-b3cf-46e6822fae5c”,“testValue:“FAILURE”,“test:“4a3b3102-d3fa-4c2c-b3cf-46e6822fae5c:FAILURE”,“testStartTimestamp:“2020-06-25T09:22:17.3Z”,{“testId:“f80bec6d-ab5c-4f63-8aea-cd2f5179195e”,“testValue:“FAILURE”,“testValue:“testValue:”FAILURE”,“test:“test:“test:”f80bec6d-ab5c-4f63-8AE5179E:FAILURE”,“test:“test:”test:“test:“test:“test:”f80bec6d-AB5D-ab5c-F63-8AE5C-F63-8testId:“e75896d2-f314-4423-87be-ea70b2ba5adb”,“testValue:“FAILURE”,“test:“e75896d2-f314-4423-87be-ea70b2ba5adb:FAILURE”,“testStartTimestamp:“2020-06-25T09:22:17.301Z”}”;
选择P_conversations_conversationId,
对话、参与者、会议、流程、结果,
JSON_值(将(P_对话_参与者_会话_流程_结果,“[”,“,”,“$.testId”)替换为testId,
JSON_值(替换(替换(P_对话_参与者_会话_流程_结果,“[”,“],”,“,”),“$.testEndTimestamp”)作为testEndTimestamp,
JSON_值(替换(@idvalue,[','','$.testValue')为[testValue],
JSON_值(替换(@idvalue,“[”,“,”,“$.testStartTimestamp”)为testStartTimestamp,
JSON_值(替换(@idvalue,“[”,“,”,“$.test”)作为测试
从仪表板表;

declare
语句中,我给出了示例数据。

Yoy可能会尝试使用
OPENJSON()
和显式模式解析输入JSON:

 SELECT *
 FROM OPENJSON(@idvalue) WITH (
    testId varchar(36) '$.testId',
    testValue varchar(100) '$.testValue',
    test varchar(100) '$.test',
    testStartTimestamp datetime2(3) '$.testStartTimestamp'
 )
结果:

testId                                  testValue   test                                             testStartTimestamp
b29b2327-527c-456d-8346-6bd22d198f21    FAILURE     b29b2327-527c-456d-8346-6bd22d198f21:FAILURE    2020-06-25 09:22:17.299
4674bc9c-9551-496b-b488-8e138a4dc459    FAILURE     4674bc9c-9551-496b-b488-8e138a4dc459:FAILURE    2020-06-25 09:22:17.299
38c20ac5-dbb7-43ad-b139-f8fde13d0ea5    FAILURE     38c20ac5-dbb7-43ad-b139-f8fde13d0ea5:FAILURE    2020-06-25 09:22:17.300
4a3b3102-d3fa-4c2c-b3cf-46e6822fae5c    FAILURE     4a3b3102-d3fa-4c2c-b3cf-46e6822fae5c:FAILURE    2020-06-25 09:22:17.300
f80bec6d-ab5c-4f63-8aea-cd2f5179195e    FAILURE     f80bec6d-ab5c-4f63-8aea-cd2f5179195e:FAILURE    2020-06-25 09:22:17.300
e75896d2-f314-4423-87be-ea70b2ba5adb    FAILURE     e75896d2-f314-4423-87be-ea70b2ba5adb:FAILURE    2020-06-25 09:22:17.301
如果JSON内容存储在表中,则需要额外的
APPLY
运算符:

SELECT j.*
-- FROM Dashboardtable d
FROM (VALUES (@idvalue)) d (P_conversations_participants_sessions_flow_outcomes)
OUTER APPLY OPENJSON(d.P_conversations_participants_sessions_flow_outcomes) WITH (
   testId varchar(36) '$.testId',
   testValue varchar(100) '$.testValue',
   test varchar(100) '$.test',
   testStartTimestamp datetime2(3) '$.testStartTimestamp'
) j
作为一个附加选项,如果要从JSON数组中提取标量值,则需要在
路径中使用索引
定义:

SELECT
   JSON_VALUE(@idvalue, '$[0].testValue') AS testValue,
   JSON_VALUE(@idvalue, '$[0].testStartTimestamp') AS testStartTimestamp,
   JSON_VALUE(@idvalue, '$[0].test') AS test 
假设您只想从变量中取出数据,那么您可以使用
OPENJSON
。如果不需要,那么您需要告诉我们您真正想要的是什么

选择*
来自OPENJSON(@idvalue)
带有(testId唯一标识符,
testValue varchar(10),
测试唯一标识符,
testStartTimestamp日期时间偏移量(1);

那么,您的SQL出了什么问题?您在哪里遇到了问题?我们无法运行上述操作,因为我们无法访问您的实例,而且您还没有为您的表
dbo.Dashboardtable提供DDL和DML。感谢您的快速回复。Msg 13609,级别16,状态1,第8行JSON文本格式不正确。找到了意外字符“”在位置201。这是我在尝试执行sql时遇到的情况。基于
OPENJSON
和显式模式的方法可能是您的第一个选择。我已经尝试使用OPENJSON。我为您的回复获取了datetime列hanks的空值。索引路径不会是静态的。它可以根据数据。它可以是1,2,也可以更多。@kathija好的。在这种情况下,使用
OPENJSON
解析所有JSON项应该是您的第一个选择。很抱歉发布错误的数据。它已经更新。这里我们还有enddatetime,它也将被设置为NULL。我也尝试了上面的查询。这仍然为enddatetime列提供NULLre不是数据中的
endatetime
(或者我假设您的意思是
testEndTimestamp
)节点@kathija,因此它当然会返回
NULL