问题描述
我们正在使用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;
基本上,我得到了数组并删除了定界字符。
有什么想法吗?
解决方法
说明:
文档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