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
相关产品推荐
相关产品推荐

