当 JSON 为 NULL 时,动态 SQL 将 JSON 属性作为列获取的问题

Posted

技术标签:

【中文标题】当 JSON 为 NULL 时,动态 SQL 将 JSON 属性作为列获取的问题【英文标题】:Issue with dynamic SQL to get JSON properties as columns when JSON is NULL 【发布时间】:2020-08-05 21:48:47 【问题描述】:

我正在尝试选择 JSON 属性作为列。需要选择的属性存储在其他一些表中

CREATE TABLE [Templates](
    [ID] [int] NOT NULL,
    [Template] [nvarchar](max)
)

INSERT INTO Templates(ID,Template)
VALUES
(1,'"FirstName":"foo"'),
(2,'"FirstName":"joe","LastName":"dow"'),
(3,'"LastName":"smith","Address":"1234 Test Drive"'),
(4,NULL)


Declare @SQL NVARCHAR(max)

--For brevity purpose i am hardcoding these property names. In reality column names will come from another table
DECLARE @properties NVARCHAR(max) = '[Address],[FirstName],[LastName]'

Set @SQL  = '
Select '+ @properties +'
 From  (
        Select T.ID
              ,j.[Key]
              ,j.[Value]
         From  Templates T
         Cross Apply OpenJSON(T.Template) AS j
       ) src
Pivot ( max(value) for [Key] in ('+ @properties +') ) pvt 
'
Exec(@SQL)

SQL Fiddle

上面的代码大部分都在工作,除了最后一行Template 为 NULL。 (ID = 4) 预期:查询应返回 4 行,对于最后一行,除 ID 之外的所有列都应为空。

【问题讨论】:

CROSS APPLY 更改为OUTER APPLY 【参考方案1】:

CROSS APPLY 要求返回行,但是,Cross Apply OpenJSON(NULL) AS j 不返回任何行。使用OUTER APPLY

' ...
OUTER APPLY OpenJSON(T.Template) AS j
...'

EXEC sp_executesql @SQL;

注意我也使用sp_executesql,因为你不能参数化EXEC (@SQL)

db<>fiddle

【讨论】:

以上是关于当 JSON 为 NULL 时,动态 SQL 将 JSON 属性作为列获取的问题的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 对象传递给 MVC 控制器时 string.empty 转换为 null

TypeError:尝试在 React 中动态生成表时无法将 undefined 或 null 转换为对象

使用SSIS从SQL Server 2005中的平面文件导入时如何保留NULL值

Java 类接收 Ajax JSON 帖子为 null

Gson对象转json时,属性值不存在时转成的null问题??

C# 动态类型 Object 属性 First 始终为 null