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

SQL Server 2017动态SQL用OPENROWSET读取JSON文件无结果求解

问题排查与修复方案

1. 核心语法错误:动态SQL变量作用域问题

你写的动态SQL内部的@strJSON_Table默认属于动态SQL的独立作用域,和外部定义的同名变量完全隔离,动态SQL执行完后外部的@strJSON_Table根本拿不到读取到的JSON内容,需要用输出参数完成跨作用域的值传递。

2. 遗漏的前置配置要求

  • 首先要开启Ad Hoc分布式查询权限,OPENROWSET才允许被调用:
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
  • 确保SQL Server服务的启动账号,对c:\json\目录以及对应JSON文件有读取权限,否则会抛出操作系统权限错误。

3. 路径转义错误

你代码里的路径写的是''c:\\json\JSON_download.json'',第二个反斜杠没有转义,会导致实际识别的路径错误,正确的转义写法要么是全用双反斜杠转义,要么用正斜杠避免转义问题:''c:\\json\\JSON_download.json''或者''c:/json/JSON_download.json''

4. 正确的完整代码示例

-- 提前定义外部变量
DECLARE @sql AS nvarchar(500)
DECLARE @strJSON_Table AS NVARCHAR(MAX) -- 定义接收JSON内容的变量
DECLARE @pintImpID INT = 1 -- 示例值,根据你的实际业务赋值

-- 动态SQL里标注@strJSON_Table为输出参数
SET @sql = N'SELECT @strJSON_Table = BulkColumn FROM OPENROWSET(BULK ''c:\\json\\JSON_download.json'' , SINGLE_CLOB) AS JTable'

-- 执行动态SQL时绑定输出参数,完成值传递
EXEC sp_executesql @sql, N'@strJSON_Table NVARCHAR(MAX) OUTPUT', @strJSON_Table = @strJSON_Table OUTPUT

-- 后续OPENJSON逻辑可直接使用拿到的@strJSON_Table变量
SELECT @pintImpID AS ImpID, OtherCol --etc
INTO temp_JSON_download
FROM OPENJSON(@strJSON_Table)
WITH(
    IsSuccessful NVARCHAR(MAX) as JSON,
    Messages NVARCHAR(MAX) as JSON,
    AccreditInfos NVARCHAR(MAX) as JSON
) AS TableA

额外注意事项

如果你的JSON文件是Unicode编码(比如UTF-16),把OPENROWSET里的SINGLE_CLOB改成SINGLE_NCLOB,避免中文乱码或者内容读取异常。

内容的提问来源于stack exchange,提问作者meridian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:06