SQL Sever 2016-行为不一致-“ JSON_VALUE或JSON_QUERY”的参数2必须为字符串文字

问题描述

我们正在使用sql Server 2016,我编写了一个使用以下代码函数

IF @JsonString IS NULL OR LTRIM(RTRIM(@JsonString)) = ''
BEGIN
   RETURN NULL;
END

DECLARE @ArrayValues VARCHAR(100);

SELECT @ArrayValues =   REPLACE(REPLACE(REPLACE(
                      JSON_QUERY(@JsonString,@JsonPathToArray),'"',''),'[',']','');

RETURN @ArrayValues;

基本上,我得到了数组并删除了定界字符。

我有2个使用此功能的存储过程。一种完美,而另一种则不然。

有什么想法吗?

解决方法

说明:

文档states,您需要SQL Server 2017+提供 ...变量作为path的值... ,这是{{1 }}错误。

对于SQL Server 2016,您可以使用"The argument 2 of the "JSON_VALUE or JSON_QUERY" must be a string literal."

OPENJSON()

附加说明:

请注意,您当前方法中的语句会替换每次出现的DECLARE @ArrayValues VARCHAR(100) DECLARE @JsonString VARCHAR(100) = '{"Key" :["a","b","c"]}' DECLARE @JsonPathToArray VARCHAR(100) = '$.Key' SELECT @ArrayValues = REPLACE(REPLACE(REPLACE( JSON_QUERY([value]),'"',''),'[',']','') FROM OPENJSON(@JsonString) WHERE CONCAT('$.',[key]) = @JsonPathToArray SELECT @ArrayValues "[字符,即使这些字符是JSON值的一部分。

因此,问题的陈述:

]

返回:

DECLARE @ArrayValues VARCHAR(100)
DECLARE @JsonString VARCHAR(100) = '{"Key" :["a","c","EscapedContent\"[]"]}'
DECLARE @JsonPathToArray VARCHAR(100) = '$.Key'

SELECT @ArrayValues = REPLACE(REPLACE(REPLACE(
                         JSON_QUERY(@JsonString,@JsonPathToArray),'');
SELECT @ArrayValues

如果要聚合一个JSON数组中的项目,则可以尝试另一种方法(同样需要SQL Server 2017 +):

a,b,c,EscapedContent\

结果:

DECLARE @ArrayValues VARCHAR(100)
DECLARE @JsonString VARCHAR(100) = '{"Key" :["a","EscapedContent\"[]"]}'
DECLARE @JsonPathToArray VARCHAR(100) = '$.Key'

SELECT @ArrayValues = STRING_AGG([value],',') WITHIN GROUP (ORDER BY CONVERT(int,[key])) 
FROm OPENJSON(@JsonString,@JsonPathToArray)
SELECT @ArrayValues