You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 01:36:08