在 OPENJSON WITH 语句中传递变量

Passing a variable in OPENJSON WITH statement

下面的脚本调用一个 API 以基础货币和其他货币作为输入,并从其响应中获取外汇 (FX) 值。在读取来自 API 的响应时,我们必须在 openjson 语句中指定 '$.rates.GBP' 以读取 FX 的值(以下脚本的最后一条语句)。我无法将其作为参数传递来使 SampleValue 动态化。我尝试使用动态 SQL 但没有成功。

请帮忙。

SQL:


SELECT  *
FROM OPENJSON((select Json_table from @json), N'$')
WITH (   
      SampleValue nvarchar(max) '$.rates.GBP' ,   
      SampleDate DATE '$.date'
      ) ;

    /*DECLARE @SQL NVARCHAR(MAX) = 
    'SELECT  *  FROM OPENJSON((select Json_table from @json), N''$'') WITH (           SampleValue  nvarchar(max)  ''$.rates.GBP'',  SampleDate DATE ''$.date'' ) ;'

 select @SQL; 
 EXEC sp_executesql @SQL;

      DECLARE @SQLstring NVARCHAR(MAX) = 
'SELECT  *
FROM OPENJSON((select Json_table from @json), N''$'') WITH (   
      SampleValue nvarchar(max) '+ ''''+ @param + ''''+ ' ,   
      SampleDate DATE'  + ''''+ '$.date'  + '''' + ' ) ;'

      select @SQLstring ; 
EXEC sp_executesql @SQLstring ;*/

像下面这样尝试

select * into #Temp from @json
DECLARE @SQL NVARCHAR(MAX) = 
    'SELECT  *  FROM OPENJSON((select * from #Temp), N''$'') WITH (           SampleValue  nvarchar(max)  ''$.rates.GBP'',  SampleDate DATE ''$.date'' ) ;'

 select @SQL; 
 EXEC sp_executesql @SQL;

如果我正确理解了您的问题并且您想在 OPENJSON WITH 语句 中传递一个变量,以下方法可能是您问题的解决方案。您需要将 JSON 内容作为参数传递给 sp_executesql:

Table:

DECLARE @json AS TABLE (Json_Table nvarchar(max))
INSERT INTO @json (Json_Table)
VALUES (N'{"base":"USD","rates":{"GBP":0.7739357155},"date":"2020-10-15"}')

声明:

DECLARE @jsonData nvarchar(max) = (SELECT Json_table FROM @json)
DECLARE @symbol char(3) = 'GBP'
DECLARE @sql nvarchar(max) = CONCAT(
   N'SELECT * FROM OPENJSON(@jsonData, N''$'') WITH (SampleValue nvarchar(max) ''$.rates.',
   @symbol,   
   N''', SampleDate date ''$.date'') j'
)   

PRINT @sql
EXEC sp_executesql @sql, N'@jsonData nvarchar(max)', @jsonData

结果:

SampleValue  SampleDate
0.7739357155 2020-10-15