我正在考虑将来自不同来源的JSON数据存储到SQL server 2016中。 理想情况下,表结构将具有JSON字段来保存数据 一个可选的JSON Schema字段,如果填充将提供显式 JSON模式,允许将数据作为with子句中的表返回。
我找不到使用存储架构的解决方案 我知道可以创建内联表值函数,但问题是 每个记录的架构可能会有所不同。
我想要做的是将json数据和输出模式传递给函数或存储过程。 如果输出模式不为null,则SQL Server可以将输出模式应用于json数据 并返回行集,否则只将JSON显示为文本。
最接近我想要的结果是使用sp_executesql, 但我本以为会有内置的支持,但我在这里或微软找不到任何例子。
使用来自microsoft docs示例的SQL,他们使用with子句
创建JSON数据和所需架构
DECLARE @json NVARCHAR(MAX)
SET @json =
N'[
{
"Order": {
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
},
"AccountNumber":"AW29825",
"Item": {
"Price":2024.9940,
"Quantity":1
}
},
{
"Order": {
"Number":"SO43661",
"Date":"2011-06-01T00:00:00"
},
"AccountNumber":"AW73565",
"Item": {
"Price":2024.9940,
"Quantity":3
}
}
]'
DECLARE @jsonOutputSchema NVARCHAR(MAX)
SET @jsonOutputSchema = N'
Number varchar(200) ''$.Order.Number'',
Date datetime ''$.Order.Date'',
Customer varchar(200) ''$.AccountNumber'',
Quantity int ''$.Item.Quantity'''
如果输出架构存在,则将结果解析为表
DECLARE @sql NVARCHAR(4000)
,@parmlist NVARCHAR(4000)
SELECT @sql = N'
SELECT * FROM
OPENJSON ( @z_json )
WITH ( ' + @jsonOutputSchema + ')'
SELECT @parmlist = N'
@z_json nvarchar(max)
'
EXEC sp_executesql @sql, @parmlist, @json
这样可行,而架构将由系统生成,而不会向公共用户公开 它是kludgy,似乎很容易被SQL注入:
SET @jsonOutputSchema = @jsonOutputSchema + '); SELECT @@SERVERNAME, SYSTEM_USER, @@VERSION --'
如果有办法参数化WITH子句,那将是理想的。它试图将它作为sql变量中的参数,但这不起作用。我查看了JSON_VALUE函数以查看它是否可以使用,但是我无法提出强类型字段的解决方案,而是返回文本。
我希望将此限制为SQL,但似乎我可能不得不这样做 从外部解析数据然后将行集传递回SQL。目前定义的模式目前为7,但似乎在增长。一些模式基于我们控制的表,而其他模式基于其他内部系统。
欢迎提出任何建议,想法或解决方法。感谢。