Проблема с динамическим c SQL для получения свойств JSON в виде столбцов, когда JSON равно NULL - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь выбрать 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 - ПУСТО. (ID = 4) Ожидается: запрос должен вернуть 4 строки, а для последней строки все столбцы должны быть пустыми, кроме идентификатора.

1 Ответ

1 голос
/ 06 августа 2020

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

...