エラーが発生します:
「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では可能です。
From JSON_QUERY(Transact-SQL) から
SQL Server 2017およびAzure SQL Databaseでは、パスの値として変数を指定できます。
SQL Server 2016では、クエリを動的に作成する必要があります。
[〜#〜] bol [〜#〜] の例のように、変数ではなく文字列json_query
を文字列として渡す必要があると思います
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
ありがとう。それは今働いています。同様の問題については、次のコードを参考にしてください
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;