0

我在 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 Server,每个表都有自己的架构。我发现可以这样做:

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 *?

4

1 回答 1

2

一种可能的方法是构建和执行动态语句,因为OPENJSON()使用默认模式(不带WITH子句)会返回一个包含 columns 的表keyvalue并且对于输入数组中的每个对象,每对都有type一行。所以,你需要一个明确的模式。要动态构建该架构,您需要使用默认架构解析整个 JSON 数组中的第一项。"key": "value"JSONOPENJSON()

陈述:

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
于 2020-04-29T08:47:06.020 回答