SQL Server динамический JSON используется в службах аналитики? - PullRequest
2 голосов
/ 22 октября 2019

Я пытаюсь понять, в каком направлении даже начинать со следующего ..

Отображение динамической формы (JSON), которую я храню в SQL Server 2016+. До сих пор я видел / пробовал пару динамических запросов, чтобы взять динамический JSON и выровнять как столбцы.

Учитывая «динамическую» природу, трудно «хранить» эти сглаживающие данные. Я просматривал временные / временные таблицы / таблицы памяти для хранения этих динамически сглаженных данных за «относительно короткий период» времени (скажем, час или два).

Меня также спросили, возможно лииспользовать динамические данные JSON при построении куба в службах Analysis Services ... опять же, учитывая динамическую природу этого, будет ли возможно что-то подобное?

Полагаю, мой вопрос двоякий:

  1. Указатели для сглаживания динамического JSON в SQL Server
  2. Можно ли взять динамический JSON, сгладить по столбцам и как-то использовать в Analysis Services? то есть, в конечном счете, для использования внутри куба?

Понимаете, вышеупомянутое немного расплывчато, но любые указатели, чтобы заставить меня двигаться в правильном направлении, были бы оценены!

Большое спасибо.

1 Ответ

1 голос
/ 22 октября 2019

Динамическое преобразование JSON в столбцы может быть сложным. Особенно, если вы НЕ уверены в структуре. Тем не менее, рассматривали ли вы вопрос о преобразовании JSON в иерархию через Recursive CTE?

Пример

declare @json varchar(max)='
[
  {
    "url": "https://www.google.com",
    "image-url": "https://www.google.com/imghp",
    "labels": [
                {
                  "source": "Bob, Inc",
                  "name": "Whips",
                  "info": "Ouch"
                },
                {
                  "source": "Weezles of Oregon",
                  "name": "Chains",
                  "info": "Let me go"
                }
              ],
    "Fact": "Fictional"
  }
]';


;with cte0 as (
   Select *
         ,[Level]=1 
         ,[Path]=convert(varchar(max),row_number() over(order by (select null)))
    From OpenJSON(@json,'$') 
   Union All
   Select R.*
         ,[Level]=p.[Level]+1 
         ,[Path]=concat(P.[Path],'\',row_number() over(order by (select null)))
    From  cte0 p 
    Cross Apply OpenJSON(p.value,'$') R
    Where P.[Type]>3
)
Select [Level]
      ,[Path]
      ,Title = replicate('|---',[Level]-1)+[Key]
      ,Item  = [Key]
      ,Value = case when [type]<4 then Value else null end 
 From cte0
 Order By [Path]

Возвращает

enter image description here

...