当 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值