Sql-Server

將變數作為參數傳遞給 json_query 函式

  • August 24, 2021

我收到錯誤:

“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

樣本數據:

{
 "Seasons": [
   {
     "Season": "12321231",
     "Products": [
       {
         "ProductId": "211",
         "ProductChannels": [
           {
             "ChannelId": 1,
             "WeekQuantities": []
           }
         ],
         "ccc": 3,
         "Tttt": 4
       }
     ]
   }
 ]
}

在 SQL Server 2017 中是可能的。

來自JSON_QUERY (Transact-SQL)

在 SQL Server 2017 和 Azure SQL 數據庫中,您可以提供一個變數作為路徑的值。

在 SQL Server 2016 中,您必須動態建構查詢。

我猜想,正如它所說的“字元串文字”,您必須傳遞json_query一個字元串而不是變數,就像在BOL範例中一樣

SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People

所以在你的情況下,你可能需要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

引用自:https://dba.stackexchange.com/questions/199593