在 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
下面的脚本调用一个 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