JSON_VALUE 不采用动态 JSON 路径

JSON_VALUE does not take dynamic JSON path

我正在使用 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"')

错误:

The argument 2 of the "JSON_VALUE or JSON_QUERY" must be a string literal.

我该如何解决这个问题?

您需要使用 SQL Server 2017+。正如 documentation 中提到的,在 SQL Server 2017 (14.x) 和 Azure SQL 数据库中,您可以提供一个变量作为值路径。但即使那样,我也不认为 N'strict $[sql:variable(@x)]."FieldName"'JSON_VALUE() 调用的有效 path 表达式。

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