SQL Server 2016解析远程JSON时OPENJSON提示格式错误如何解决
故障排查方向
你遇到的报错JSON text is not properly formatted. Unexpected character 'A' is found at position 0.本质原因是@jsn变量存储的不是合法JSON内容,开头第一个字符是A的非JSON文本,大概率是PowerShell执行报错的输出内容,可按以下优先级排查:
1. 优先修复PowerShell命令拼接的显性语法错误
你当前脚本中拼接PowerShell命令时,bypass和-command之间缺少空格,最终生成的命令会变成...executionpolicy bypass-command...,PowerShell无法识别该参数,会直接返回参数错误提示,错误信息开头通常为A(比如"A positional parameter cannot be found that accepts argument ..."),完全匹配你的报错特征。
修复方案:在bypass后补充空格即可:
DECLARE @c varchar(1000) = N'powershell.exe -noprofile -executionpolicy bypass ' -- 上面一行末尾已加空格 + N'-command (Invoke-WebRequest -Uri "'+@url+'" -UseBasicParsing).content'
2. 验证原始返回内容
修复语法后如果仍报错,可在调用存储过程后添加输出语句,直接查看@jsn的原始内容,确认是否为预期的JSON:
DECLARE @jsn nvarchar(max) EXEC wget @url = 'https://<URL-WITH-JSON-DATA>', @payload = @jsn output -- 新增这行查看原始返回 SELECT @jsn AS RawReturnContent -- SELECT * FROM OPENJSON (@jsn, N'$')
如果返回内容是错误文本,可根据提示对应处理:
- 提示网络不通/连接超时:确认SQL Server所在服务器能正常访问目标URL,且无防火墙、代理限制
- 提示权限不足:确认SQL Server服务账户有外网访问权限、PowerShell执行权限
3. 处理编码与空值问题
如果原始返回内容看起来是JSON但仍解析失败,可调整存储过程处理逻辑:
- 过滤
xp_cmdshell返回的NULL行,避免拼接异常 - 强制PowerShell输出UTF8编码内容,避免乱码或BOM头导致解析失败
优化后的存储过程参考:
CREATE PROCEDURE wget @url VARCHAR(255), @payload NVARCHAR(max) OUTPUT AS BEGIN DECLARE @op TABLE (op nvarchar(max)) DECLARE @c varchar(1000) = N'powershell.exe -noprofile -executionpolicy bypass ' + N'-command [System.Text.Encoding]::UTF8.GetString((Invoke-WebRequest -Uri "'+@url+'" -UseBasicParsing).RawContentStream.ToArray())' INSERT INTO @op EXEC xp_cmdshell @c -- 过滤NULL行再拼接 SELECT @payload = STRING_AGG(op, '') FROM @op WHERE op IS NOT NULL END
4. 验证JSON合法性
如果确认返回的是JSON文本,可复制内容到本地JSON校验工具检查格式,确认无多余换行、特殊字符、语法错误后再在SQL Server中解析。
内容的提问来源于stack exchange,提问作者Stig Kølbæk
相关产品推荐
相关产品推荐

