web-dev-qa-db-ja.com

変数をパラメーターとしてjson_query関数に渡す

エラーが発生します:

「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
        }
      ]
    }
  ]
}
4
Arvind Mishra

SQL Server 2017では可能です。

From JSON_QUERY(Transact-SQL) から

SQL Server 2017およびAzure SQL Databaseでは、パスの値として変数を指定できます。

SQL Server 2016では、クエリを動的に作成する必要があります。

8
Mikael Eriksson

[〜#〜] 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
7
Mark Sinkinson

ありがとう。それは今働いています。同様の問題については、次のコードを参考にしてください

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