0

上下文:我有一个带有以下表单的 JSON 文档保存到 SQL Server 临时表中的列中

[{"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 的 OPENJSON 函数从 JSON 中提取文件名、修改日期和文件大小。使用下面的代码块,我正在尝试获取的字段中提取 NULL 值。为什么?我该如何解决这个问题?

t-sql

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

同样这种方法也行不通。想法/建议? 在此处输入图像描述

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 
4

2 回答 2

3

您需要使用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

附表声明:

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
于 2019-12-08T18:21:29.683 回答
2

你的尝试非常接近。您不需要放入'$.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;
于 2019-12-08T18:21:36.693 回答