sql - 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 个使用此函数的存储过程。一个工作完美,另一个没有。
有任何想法吗?
解决方案
说明:
文档指出,您需要 SQL Server 2017+ 来提供一个...变量作为路径的值...这是对"The argument 2 of the "JSON_VALUE or JSON_QUERY" must be a string literal."
您语句中错误的解释。
对于 SQL Server 2016,您可以使用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","b","c","EscapedContent\"[]"]}'
DECLARE @JsonPathToArray VARCHAR(100) = '$.Key'
SELECT @ArrayValues = REPLACE(REPLACE(REPLACE(
JSON_QUERY(@JsonString, @JsonPathToArray)
,'"', ''), '[', ''), ']', '');
SELECT @ArrayValues
返回:
a,b,c,EscapedContent\
如果您想从一个 JSON 数组聚合项目,您可以尝试另一种方法(再次需要 SQL Server 2017+):
DECLARE @ArrayValues VARCHAR(100)
DECLARE @JsonString VARCHAR(100) = '{"Key" :["a","b","c", "EscapedContent\"[]"]}'
DECLARE @JsonPathToArray VARCHAR(100) = '$.Key'
SELECT @ArrayValues = STRING_AGG([value], ',') WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROm OPENJSON(@JsonString, @JsonPathToArray)
SELECT @ArrayValues
结果:
a,b,c,EscapedContent"[]
推荐阅读
- python - 带有 Google Cloud Compute 启动脚本的 ImportError
- json - 为什么我不能从中制作一个键控流
- node.js - 从附件获取图像作为 Arraybuffer 后如何使用 Axios 将图像作为文件发布
- c# - WPF C#捕获具有半透明背景的画布图像
- c++ - Qt 串行通信
- android - 错误:无法解决:com.android.support.constraint:constraintlayout:1.1.3 在项目结构对话框中显示受影响的模块:app
- postgresql - 如何优化 PostgreSQL 中时间戳的连接
- reactjs - 在 react-hooks textInput 中自动添加字符
- python - 时间为零的signal.setitimer,后跟signal.pause不起作用
- python - python Flask API AttributeError AttributeError:'_thread._local'对象没有属性'value'