2016-04-21 2 views
2

Предположим, у вас естьПостроить JSON с переменным ключом/json_modify переменной 2 параметра

create schema tmp 
go 

create table tmp.Properties 
(
    ParentId uniqueidentifier not null, 
    PropertyName nvarchar(20) not null, 
    PropertyValue nvarchar(100) null, 

    primary key (ParentId,PropertyName) 
) 
go 

create table tmp.FullData 
(
    ParentId uniqueidentifier not null, 
    Properties nvarchar(max) null, 

    primary key (ParentId) 
) 
go 

declare @id1 uniqueidentifier = 'F1935D6A-D5A6-4FA1-ACF4-BA3858804CEC', 
     @id2 uniqueidentifier = 'F1935D6B-D5A6-4FA1-ACF4-BA3858804CEC' 

insert into tmp.Properties 
values 
(@id1, 'FirstName', 'Luke'), 
(@id1, 'LastName', 'Skywalker'), 
(@id2, 'FirstName', 'Han'), 
(@id2, 'LastName', 'Solo') 

пожалуйста, считают, что:

  • свойства создаются динамически, и я не могу знать заранее PropertyNames
  • на момент родители таблица содержит 1M и свойства таблица содержит 23M записи

как я могу заполнить tmp.FullData с:

ParentId        Properties 
------------------------------------ ------------------------------------------------ 
F1935D6A-D5A6-4FA1-ACF4-BA3858804CEC { "FirstName": "Luke", "LastName": "Skywalker" } 
F1935D6B-D5A6-4FA1-ACF4-BA3858804CEC { "FirstName": "Han", "Test1": "Solo" } 

Я попытался

insert into tmp.FullData (ParentId, Properties) 
select distinct ParentId, '{}' from tmp.Properties 

update f 
set Properties = json_modify(Properties, 'append $.' + p.PropertyName, p.PropertyValue) 
from tmp.FullData f 
cross join tmp.Properties p 

, но как вы знаете/представьте

Msg 13610, Level 16, State 2, Line 39 
The argument 2 of the "JSON_MODIFY" must be a string literal. 

любой другой вариант? заранее спасибо

ответ

0

Пропустить обновление и вставить непосредственно в tmp.FullData:

INSERT INTO tmp.FullData (ParentId, Properties) 
SELECT 
    ParentId 
    ,'{' 
    + STUFF((
       SELECT ',' + '"' + PropertyName + '":"' + PropertyValue + '"' 
       FROM tmp.Properties a 
       WHERE a.ParentId = p.ParentId 
       FOR XML PATH(''), TYPE 
      ).value('.', 'VARCHAR(MAX)'), 1, 1, '' 
      ) + '}' AS Properties 
FROM tmp.Properties p 
GROUP BY ParentId; 
Смежные вопросы