открыть json: ВЫБРАТЬ звезду - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть таблица в файле json (C: \ db. json):

[{"_id":"81743561","_record_number":"1","_form_id":"618213","_user_id":"218754",...},
{"_id":"81782299","_record_number":"2","_form_id":"618213","_user_id":"218754",...},
{"_id":"81784481","_record_number":"3","_form_id":"618213","_user_id":"218754",...}]

В ней около 60 «столбцов». У меня есть 100 таких таблиц для импорта на сервер SQL, каждая со своей схемой. Я обнаружил, что это можно сделать следующим образом:

Declare @JSON varchar(max)
SELECT @JSON=BulkColumn
FROM OPENROWSET (BULK 'C:\db.json', SINGLE_CLOB) import
SELECT *
FROM OPENJSON (@JSON)
WITH 
(
    _id integer,
    _record_number integer,
    _form_id integer,
    _user_id integer,
    ...
)

Мне действительно нужно избегать ручного написания списка столбцов. Один из вариантов - проанализировать json и создать список столбцов. Прежде чем я начал идти по этому пути, мне было интересно, есть ли способ избежать перечисления столбцов, что-то эквивалентное SELECT *?

1 Ответ

2 голосов
/ 29 апреля 2020

Один из возможных подходов - создать и выполнить динамический оператор c, поскольку OPENJSON() со схемой по умолчанию (без предложения WITH) возвращает таблицу со столбцами key, value и type и одна строка для каждой пары "key": "value" для каждого объекта во входном массиве JSON. Итак, вам нужна явная схема. Чтобы построить эту схему динамически, вам необходимо проанализировать первый элемент из всего массива JSON, используя OPENJSON() со схемой по умолчанию.

Оператор:

DECLARE @json varchar(max)

SET @json = N'[
   {"_id":"81743561","_record_number":"1","_form_id":"618213","_user_id":"218754"},
   {"_id":"81782299","_record_number":"2","_form_id":"618213","_user_id":"218754"},
   {"_id":"81784481","_record_number":"3","_form_id":"618213","_user_id":"218754"}
]'
-- Or read JSON from file
-- SELECT @json = BulkColumn
-- FROM OPENROWSET (BULK 'C:\db.json', SINGLE_CLOB)

DECLARE @stm nvarchar(max) 

SELECT @stm = STRING_AGG(CAST([key] + ' varchar(max) ' AS varchar(max)), ', ')
FROM OPENJSON(@JSON, '$[0]')

SET @stm = N'SELECT * FROM OPENJSON (@json) WITH (' + @stm + N')'

PRINT @stm
EXEC sp_executesql @stm, N'@json varchar(max)', @json

Результат:

_id      _record_number _form_id    _user_id
81743561 1              618213      218754
81782299 2              618213      218754
81784481 3              618213      218754
...