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

TSQL调用sp_OACreate未生成token,调用Web服务获取数据报错

问题排查与修复方案

1. 核心高频问题:TLS版本不兼容

你请求的是HTTPS站点,当前绝大多数公开接口已禁用低版本TLS1.0/1.1,而MSXML2.ServerXMLHTTP默认使用旧协议发起请求,会导致请求失败但你未捕获对应环节的错误,表现为后续操作对象未初始化。
需要在open调用之后、send调用之前添加指定TLS 1.2的配置代码:

-- 强制使用TLS 1.2发起请求,9为协议配置项ID,3072对应TLS 1.2枚举值
EXEC @ret = sp_OAMethod @token, 'setOption', NULL, 9, 3072
IF @ret <> 0 
BEGIN
    -- 输出具体错误信息
    DECLARE @errSource NVARCHAR(255), @errDesc NVARCHAR(255)
    EXEC sp_OAGetErrorInfo @token, @errSource OUT, @errDesc OUT
    RAISERROR('请求配置失败: 来源%s, 描述%s', 16, 1, @errSource, @errDesc)
    RETURN
END

2. 补充全链路错误捕获

你当前只校验了对象创建环节的返回值,后续open/send/读取返回值环节的错误都没有捕获,无法定位具体失败节点,每个OLE调用后都要添加错误判断逻辑。

3. 权限校验

确认SQL Server服务的运行账户拥有对外访问公网HTTPS接口的权限:

  • 打开Windows服务面板,找到SQL Server (你的实例名)服务,查看运行账户
  • 不要使用默认的本地服务/网络服务账户,可更换为有网络访问权限的域账户或本地管理员账户测试

4. 修正后完整可用代码

EXEC sp_configure 'show advanced options', 1
RECONFIGURE 
GO

EXEC sp_configure 'Ole Automation Procedures', 1
RECONFIGURE
GO

declare @token          int
      , @ret            int
      , @url            nvarchar(max)
      , @authheader     nvarchar(64)
      , @contenttype    nvarchar(64)
      , @apikey         nvarchar(32)
      , @errSource      NVARCHAR(255)
      , @errDesc        NVARCHAR(255)

declare @json           AS TABLE(Json_Table NVARCHAR(MAX))

-- 目标接口地址
SET @url = 'https://opendata.cbs.nl/ODataApi/OData/80477ned/PlaatsEnGemeentenamen'

-- 指定使用6.0版本的请求对象,兼容性更好
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @token, OUT;
IF @ret <> 0 
BEGIN
    EXEC sp_OAGetErrorInfo @token, @errSource OUT, @errDesc OUT
    RAISERROR('创建请求对象失败: 来源%s, 描述%s', 16, 1, @errSource, @errDesc)
    RETURN
END

-- 打开连接
EXEC @ret  = sp_OAMethod @token, 'open', null, 'GET', @url, 'false';
IF @ret <> 0 
BEGIN
    EXEC sp_OAGetErrorInfo @token, @errSource OUT, @errDesc OUT
    RAISERROR('打开连接失败: 来源%s, 描述%s', 16, 1, @errSource, @errDesc)
    GOTO Cleanup
END

-- 强制使用TLS 1.2
EXEC @ret = sp_OAMethod @token, 'setOption', NULL, 9, 3072
IF @ret <> 0 
BEGIN
    EXEC sp_OAGetErrorInfo @token, @errSource OUT, @errDesc OUT
    RAISERROR('配置TLS版本失败: 来源%s, 描述%s', 16, 1, @errSource, @errDesc)
    GOTO Cleanup
END

-- 发送请求
EXEC @ret  = sp_OAMethod @token, 'send'
IF @ret <> 0 
BEGIN
    EXEC sp_OAGetErrorInfo @token, @errSource OUT, @errDesc OUT
    RAISERROR('发送请求失败: 来源%s, 描述%s', 16, 1, @errSource, @errDesc)
    GOTO Cleanup
END

-- 写入结果表
INSERT INTO @json (Json_Table) EXEC sp_OAGetProperty @token, 'ResponseText'

-- 查询返回结果
SELECT * FROM @json

-- 销毁请求对象释放资源
Cleanup:
EXEC sp_OADestroy @token

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:54:07