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

解决什么问题
日常集成里常见这些痛点:
- 外部数据在 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\)。
如何部署
首次安装
- 确认 SQL Server 能访问上述目录中的
SqlWebServiceIntegration.dll - 打开
Setup.sql,将创建程序集处的路径改为本机实际路径,例如:
CREATE ASSEMBLY SqlWebServiceIntegration
FROM 'D:\SqlCLR\SqlWebServiceIntegration\SqlWebServiceIntegration.dll'
WITH PERMISSION_SET = UNSAFE
- 在目标数据库执行
Setup.sql
脚本会启用 CLR、设置当前库可信任,并创建两个存储过程。
版本更新
重新编译并替换 DLL 后:
- 同样修改
Update.sql中的 DLL 路径 - 在目标数据库执行
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 主机能访问目标地址,并处理好防火墙与证书相关配置
- 生产环境中妥善保管令牌等凭证,按需限制可调用的接口范围
评论区