将变量作为参数传递给 json_query 函数

Arv*_*hra 6 sql-server t-sql json sql-server-2016

我收到错误:

“JSON_VALUE 或 JSON_QUERY”的参数 2 必须是字符串文字

...同时尝试将变量作为参数传递给JSON_QUERY函数。请帮我解决它。

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200);

WHILE @cnt <= 10
BEGIN
    set @str = '$.Seasons[0].Products['+convert(varchar,@cnt)+'].ProductChannels';
    set @str = char(39) +@str+ char(39);
    PRINT @STR
    select @json = json_query(jfile,@STR) from Import.tstjson;
--MORE CODE     
   SET @cnt = @cnt + 1;
END
Run Code Online (Sandbox Code Playgroud)

样本数据:

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200);

WHILE @cnt <= 10
BEGIN
    set @str = '$.Seasons[0].Products['+convert(varchar,@cnt)+'].ProductChannels';
    set @str = char(39) +@str+ char(39);
    PRINT @STR
    select @json = json_query(jfile,@STR) from Import.tstjson;
--MORE CODE     
   SET @cnt = @cnt + 1;
END
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 9

在 SQL Server 2017 中是可能的。

来自JSON_QUERY (Transact-SQL)

在 SQL Server 2017 和 Azure SQL 数据库中,您可以提供一个变量作为路径的值。

在 SQL Server 2016 中,您必须动态构建查询。


Mar*_*son 9

我猜想,正如它所说的“字符串文字”,你必须传递json_query一个字符串而不是一个变量,就像在BOL示例中一样

SELECT PersonID,FullName,
 JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您可能需要EXEC.

免责声明:您需要确保您实现的代码不受 SQL 注入的影响。

DECLARE @SQL VARCHAR(500); 
DECLARE @cnt INT = 1;

WHILE @cnt <= 10
BEGIN
    SET @SQL = 'SELECT json_query(jfile, ''$.Seasons[0].Products['+convert(varchar(2),@cnt)+'].ProductChannels'') from Import.tstjson';
    EXEC @SQL;
    SET @cnt = @cnt + 1;
END
Run Code Online (Sandbox Code Playgroud)