JSON_VALUE не принимает динамический путь JSON

#sql-server #json-value

#sql-server #json-значение

Вопрос:

Я использую SQL Server 2016.

Пока это работает нормально:

 SELECT JSON_VALUE(N'[{"FieldName":"xyz"}]', N'strict $[0]."FieldName"')
  

Это повторяет ошибку:

 DECLARE @x nvarchar(100)
SET @x =N'0'

SELECT JSON_VALUE(N'[{"FieldName":"xyz"}]', N'strict $[' @x ']."FieldName"')

SELECT JSON_VALUE(N'[{"FieldName":"xyz"}]', N'strict $[sql:variable(@x)]."FieldName"')
  

Ошибка:

Аргумент 2 «JSON_VALUE или JSON_QUERY» должен быть строковым литералом.

Как я могу это решить?

Комментарии:

1. sql:variable() Синтаксис не поддерживается ни в одной версии; это работает только для запросов XML.

Ответ №1:

Вам необходимо использовать SQL Server 2017 . Как упоминается в документации, в SQL Server 2017 (14.x) и в базе данных SQL Azure вы можете указать переменную в качестве значения path . Но даже тогда я не думаю, что N'strict $[sql:variable(@x)]."FieldName"' это допустимое path выражение для JSON_VALUE() вызова.

Рабочий пример для SQL Server 2017 :

 DECLARE @x nvarchar(100)
SET @x = N'0'

SELECT JSON_VALUE(N'[{"FieldName":"xyz"}]', N'strict $['   @x   ']."FieldName"')
  

Для SQL Server 2016 вы можете попробовать следующее:

 DECLARE @json nvarchar(100) = N'[{"FieldName":"xyz"}]'
DECLARE @x nvarchar(100) = N'0'

SELECT JSON_VALUE([value], '$.FieldName')
FROM OPENJSON(@json) j1
WHERE [key] = @x