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
}
]
}
]
}
C'est possible dans SQL Server 2017.
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.
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
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;