通过 T-SQL 中的 OpenJSON 遍历 JSON
Traversing JSON via OpenJSON in T-SQL
上下文: 我有一个 JSON 文档,其格式如下,保存到 SQL 服务器 table 的临时列中
[{"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121049", "File_Size": "Filesize:7196"}}, {"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121017", "File_Size": "Filesize:3949"}}]
问题: 我正在尝试使用 T-SQL 的 OPEN[从 JSON 中提取文件名、修改日期和文件大小=30=]函数。使用下面的代码块,我在我试图获取的字段中提取 NULL 值。为什么?我该如何解决这个问题?
SELECT ##jsondump.my_json, jsn.[file_name], jsn.last_modified, jsn.file_size
FROM ##jsondump
OUTER APPLY (
SELECT * FROM OPENJSON(##jsondump.my_json, '$.File')
WITH (
[file_name] NVARCHAR(50) '$.File_Name',
last_modified NVARCHAR(50) '$.Last_Modified',
file_size NVARCHAR(50) '$.File_Size'
)
) AS jsn
同样这个方法也不行。 Thoughts/suggestions?
DECLARE @json NVARCHAR(MAX)
SET @json = (SELECT my_json FROM ##jsondump)
SELECT json_column.*,
JSON_VALUE([value], '$.File_Name') As [File_Name],
JSON_VALUE([value], '$.Last_Modified') As Last_Modified,
JSON_VALUE([value], '$.File_Size') As File_Size
FROM OPENJSON(@json) as json_column
您需要将 OPENJSON()
与显式架构和 AS JSON
选项一起使用,以指定引用的 属性 包含内部 JSON
对象:
JSON:
DECLARE @json nvarchar(max) = N'[
{
"File":{
"File_Name":"SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt",
"Last_Modified":"Lastmodified:20191125.121049",
"File_Size":"Filesize:7196"
}
},
{
"File":{
"File_Name":"SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt",
"Last_Modified":"Lastmodified:20191125.121017",
"File_Size":"Filesize:3949"
}
}
]'
声明:
SELECT j2.*
FROM OPENJSON(@json) WITH (
[File] nvarchar(max) '$.File' AS JSON
) j1
CROSS APPLY OPENJSON(j1.[File]) WITH (
File_Name nvarchar(100) '$.File_Name',
Last_Modified nvarchar(100) '$.Last_Modified',
File_Size nvarchar(100) '$.File_Size'
) j2
声明 table:
SELECT t.my_json, j2.[File_Name], j2.Last_Modified, j2.File_Size
FROM ##jsondump t
CROSS APPLY OPENJSON(t.my_json) WITH (
[File] nvarchar(max) '$.File' AS JSON
) j1
CROSS APPLY OPENJSON(j1.[File]) WITH (
File_Name nvarchar(100) '$.File_Name',
Last_Modified nvarchar(100) '$.Last_Modified',
File_Size nvarchar(100) '$.File_Size'
) j2
您的尝试非常接近。您不需要将 '$.File'
放在 OPENJSON
语句中,而是放在 WITH
:
DECLARE @JSON nvarchar(MAX) = N'[{"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121049", "File_Size": "Filesize:7196"}}, {"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121017", "File_Size": "Filesize:3949"}}]';
SELECT *
FROM (VALUES(@JSON))V(J)
CROSS APPLY OPENJSON(V.J) WITH
(file_name nvarchar(50) '$.File.File_Name',
last_modified nvarchar(50) '$.File.Last_Modified',
file_size nvarchar(50) '$.File.File_Size') OJ;
上下文: 我有一个 JSON 文档,其格式如下,保存到 SQL 服务器 table 的临时列中
[{"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121049", "File_Size": "Filesize:7196"}}, {"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121017", "File_Size": "Filesize:3949"}}]
问题: 我正在尝试使用 T-SQL 的 OPEN[从 JSON 中提取文件名、修改日期和文件大小=30=]函数。使用下面的代码块,我在我试图获取的字段中提取 NULL 值。为什么?我该如何解决这个问题?
SELECT ##jsondump.my_json, jsn.[file_name], jsn.last_modified, jsn.file_size
FROM ##jsondump
OUTER APPLY (
SELECT * FROM OPENJSON(##jsondump.my_json, '$.File')
WITH (
[file_name] NVARCHAR(50) '$.File_Name',
last_modified NVARCHAR(50) '$.Last_Modified',
file_size NVARCHAR(50) '$.File_Size'
)
) AS jsn
同样这个方法也不行。 Thoughts/suggestions?
DECLARE @json NVARCHAR(MAX)
SET @json = (SELECT my_json FROM ##jsondump)
SELECT json_column.*,
JSON_VALUE([value], '$.File_Name') As [File_Name],
JSON_VALUE([value], '$.Last_Modified') As Last_Modified,
JSON_VALUE([value], '$.File_Size') As File_Size
FROM OPENJSON(@json) as json_column
您需要将 OPENJSON()
与显式架构和 AS JSON
选项一起使用,以指定引用的 属性 包含内部 JSON
对象:
JSON:
DECLARE @json nvarchar(max) = N'[
{
"File":{
"File_Name":"SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt",
"Last_Modified":"Lastmodified:20191125.121049",
"File_Size":"Filesize:7196"
}
},
{
"File":{
"File_Name":"SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt",
"Last_Modified":"Lastmodified:20191125.121017",
"File_Size":"Filesize:3949"
}
}
]'
声明:
SELECT j2.*
FROM OPENJSON(@json) WITH (
[File] nvarchar(max) '$.File' AS JSON
) j1
CROSS APPLY OPENJSON(j1.[File]) WITH (
File_Name nvarchar(100) '$.File_Name',
Last_Modified nvarchar(100) '$.Last_Modified',
File_Size nvarchar(100) '$.File_Size'
) j2
声明 table:
SELECT t.my_json, j2.[File_Name], j2.Last_Modified, j2.File_Size
FROM ##jsondump t
CROSS APPLY OPENJSON(t.my_json) WITH (
[File] nvarchar(max) '$.File' AS JSON
) j1
CROSS APPLY OPENJSON(j1.[File]) WITH (
File_Name nvarchar(100) '$.File_Name',
Last_Modified nvarchar(100) '$.Last_Modified',
File_Size nvarchar(100) '$.File_Size'
) j2
您的尝试非常接近。您不需要将 '$.File'
放在 OPENJSON
语句中,而是放在 WITH
:
DECLARE @JSON nvarchar(MAX) = N'[{"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837I_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121049", "File_Size": "Filesize:7196"}}, {"File": {"File_Name": "SCAN_6X_AHMC_AAPC_837P_11182019_11242019.txt", "Last_Modified": "Lastmodified:20191125.121017", "File_Size": "Filesize:3949"}}]';
SELECT *
FROM (VALUES(@JSON))V(J)
CROSS APPLY OPENJSON(V.J) WITH
(file_name nvarchar(50) '$.File.File_Name',
last_modified nvarchar(50) '$.File.Last_Modified',
file_size nvarchar(50) '$.File.File_Size') OJ;