有没有办法在SQL Server中使用传入的模式参数从JSON生成rowdata?

时间:2018-01-19 22:13:20

标签: json sql-server sql-server-2016

我正在考虑将来自不同来源的JSON数据存储到SQL server 2016中。 理想情况下,表结构将具有JSON字段来保存数据 一个可选的JSON Schema字段,如果填充将提供显式 JSON模式,允许将数据作为with子句中的表返回。

我找不到使用存储架构的解决方案 我知道可以创建内联表值函数,但问题是 每个记录的架构可能会有所不同。

我想要做的是将json数据和输出模式传递给函数或存储过程。 如果输出模式不为null,则SQL Server可以将输出模式应用于json数据 并返回行集,否则只将JSON显示为文本。

最接近我想要的结果是使用sp_executesql, 但我本以为会有内置的支持,但我在这里或微软找不到任何例子。

使用来自microsoft docs示例的SQL,他们使用with子句

JSON data from Microsoft

创建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,但似乎在增长。一些模式基于我们控制的表,而其他模式基于其他内部系统。

欢迎提出任何建议,想法或解决方法。感谢。

0 个答案:

没有答案