侧边栏壁纸
博主头像
平凡之路博主等级

生活原本沉闷,但跑起来就会有风!

  • 累计撰写 111 篇文章
  • 累计创建 32 个标签
  • 累计收到 24 条评论

目 录CONTENT

文章目录

SQL Server 中调用 WebService / WebAPI

平凡之路
2026-11-10 / 0 评论 / 0 点赞 / 5 阅读 / 1,023 字

在 SQL Server 中直接调用 WebService / WebAPI

通过 SQL CLR,可在 T-SQL 中直接调用外部 SOAP 或 HTTP 接口,并将 XML、JSON 响应解析为横向结果集,便于查询、关联与落库。
下载地址:https://gitee.com/fightroad/sql-web-service-integration

640

解决什么问题

日常集成里常见这些痛点:

  • 外部数据在 SOAP / REST 接口中,库内却只能靠 SSIS、链接服务器或额外程序中转
  • 每个接口都要单独写客户端,维护成本高
  • 希望在作业、存储过程里直接取数,并立刻参与 SQL 运算
  • 联调阶段需要用本地样例响应验证解析逻辑,再切换到真实地址

本方案将「发起请求 → 解析响应 → 展平成表」封装为存储过程,在 SQL Server 内一次完成。

适用场景

  • 调用 SOAP WebService(如 .asmx、WCF),按 XPath 提取业务节点
  • 调用 REST / WebAPI,按 JSONPath 提取对象或数组
  • 在定时作业、存储过程中拉取外部数据并写入业务表
  • 使用本地 XML / JSON 文件模拟接口响应,先验证解析再对接线上服务

目录说明

发布包包含:

文件 说明
SqlWebServiceIntegration.dll CLR 程序集
Setup.sql 首次部署脚本(启用 CLR、注册程序集、创建存储过程)
Update.sql 更新脚本(删除旧对象后重新注册)
README.md 本说明

将整个目录放到 SQL Server 主机可访问的路径即可(例如 D:\SqlCLR\SqlWebServiceIntegration\)。

如何部署

首次安装

  1. 确认 SQL Server 能访问上述目录中的 SqlWebServiceIntegration.dll
  2. 打开 Setup.sql,将创建程序集处的路径改为本机实际路径,例如:
CREATE ASSEMBLY SqlWebServiceIntegration
FROM 'D:\SqlCLR\SqlWebServiceIntegration\SqlWebServiceIntegration.dll'
WITH PERMISSION_SET = UNSAFE
  1. 在目标数据库执行 Setup.sql

脚本会启用 CLR、设置当前库可信任,并创建两个存储过程。

版本更新

重新编译并替换 DLL 后:

  1. 同样修改 Update.sql 中的 DLL 路径
  2. 在目标数据库执行 Update.sql

能力说明

ExecuteWebServiceToHorizontalTable — 调用 SOAP,或读取本地 XML。

参数 必需 说明
@serviceUrl 是 服务地址,或本地文件路径(file://...)
@soapAction 否 SOAP Action;读本地文件时可为空
@requestXml 否 SOAP 请求体;读本地文件时可为空
@xpath 是 定位数据节点的 XPath

ExecuteWebApiToHorizontalTable — 调用 HTTP API,或读取本地 JSON。

参数 必需 说明
@apiUrl 是 接口地址,或本地文件路径(file://...)
@method 否 HTTP 方法,默认 GET
@requestBody 否 POST / PUT 等请求体
@jsonPath 是 定位数据的 JSONPath
@headers 否 请求头,格式 Name:Value;Name2:Value2

返回字段类型为 NVARCHAR(MAX);数组会自动展开为多行,可直接当作普通结果集使用。

调用示例

调用 SOAP

EXEC dbo.ExecuteWebServiceToHorizontalTable
    @serviceUrl = 'http://example.com/service.asmx',
    @soapAction = 'http://example.com/GetData',
    @requestXml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <GetData xmlns="http://example.com/">
                <param>value</param>
            </GetData>
        </soap:Body>
    </soap:Envelope>',
    @xpath = '//*[local-name()="GetDataResponse"]/*[local-name()="GetDataResult"]/*'

调用 WebAPI

EXEC dbo.ExecuteWebApiToHorizontalTable
    @apiUrl = 'https://api.example.com/data',
    @method = 'GET',
    @requestBody = NULL,
    @jsonPath = '$.data[*]',
    @headers = 'Authorization:Bearer your-token;Content-Type:application/json'

本地文件联调

-- XML
EXEC dbo.ExecuteWebServiceToHorizontalTable
    @serviceUrl = 'file://C:\demo\data.xml',
    @soapAction = NULL,
    @requestXml = NULL,
    @xpath = '/Root/Students/Student'

-- JSON
EXEC dbo.ExecuteWebApiToHorizontalTable
    @apiUrl = 'file://C:\demo\data.json',
    @method = 'GET',
    @requestBody = NULL,
    @jsonPath = '$.Students[*]',
    @headers = NULL

使用建议

  • 先确认 @xpath / @jsonPath 能准确命中业务节点;结构复杂时可用本地样例文件验证
  • SOAP 请求需使用完整 Envelope
  • 需要鉴权时,通过 @headers 传入(例如 Bearer Token)
  • 确保 SQL Server 主机能访问目标地址,并处理好防火墙与证书相关配置
  • 生产环境中妥善保管令牌等凭证,按需限制可调用的接口范围
0

评论区