web-dev-qa-db-fra.com

Passer la variable comme paramètre à la fonction json_query

Je reçois une erreur:

L'argument 2 de "JSON_VALUE ou JSON_QUERY" doit être un littéral de chaîne

... tout en essayant de passer une variable comme paramètre à JSON_QUERY une fonction. Veuillez m'aider à le résoudre.

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

Exemples de données:

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

C'est possible dans SQL Server 2017.

De JSON_QUERY (Transact-SQL)

Dans SQL Server 2017 et dans Azure SQL Database, vous pouvez fournir une variable comme valeur de chemin.

Dans SQL Server 2016, vous devez créer la requête de manière dynamique.

8
Mikael Eriksson

Je suppose que comme il est dit "chaîne littérale", vous devez passer json_query une chaîne et non une variable, comme dans l'exemple BOL

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

Donc, dans votre cas, vous auriez probablement besoin de EXEC.

Avertissement : vous devrez vous assurer que votre code implémenté n'est pas soumis à l'injection 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
7
Mark Sinkinson

Merci. Ça marche maintenant. On peut prendre l'aide du code suivant pour des problèmes similaires

SET @SQLString = 'SELECT @json = json_query(jfile, ''$.Seasons[0].Products['+convert(varchar,@cnt)+'].ProductChannels'') from Import.tstjson';
    print @SQLString
    SET @ParmDefinition = N'@json NVARCHAR(MAX) OUTPUT';
    EXECUTE sp_executesql  
    @SQLString  
    ,@ParmDefinition  
    ,@json = @json1 OUTPUT; 
0
Arvind Mishra