openjson : SELECT 星
openjson : SELECT star
我在 json 文件中有一个 table (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 个 "columns"。我有 100 个 "tables" 像这样导入到 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 *
?
一种可能的方法是构建和执行动态语句,因为 OPENJSON()
具有默认模式(没有 WITH
子句)returns table 具有列 key
、value
和 type
以及输入 JSON
数组中每个对象的每个 "key": "value"
对一行。因此,您需要一个显式模式。要动态构建该架构,您需要使用具有默认架构的 OPENJSON()
来解析整个 JSON 数组中的第一项。
声明:
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
我在 json 文件中有一个 table (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 个 "columns"。我有 100 个 "tables" 像这样导入到 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 *
?
一种可能的方法是构建和执行动态语句,因为 OPENJSON()
具有默认模式(没有 WITH
子句)returns table 具有列 key
、value
和 type
以及输入 JSON
数组中每个对象的每个 "key": "value"
对一行。因此,您需要一个显式模式。要动态构建该架构,您需要使用具有默认架构的 OPENJSON()
来解析整个 JSON 数组中的第一项。
声明:
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