在SQL Server中,存储过程默认只能操作数据库内部数据,但业务常常要求把外部API的返回结果直接写进表。借助CLR集成或外部脚本,可以让存储过程具备调用Web接口并处理响应的能力。

一、使用CLR集成处理API调用
CLR集成允许将点NET程序集注册到SQL Server,并在存储过程中调用。我们可以在C#里用HttpClient请求API,把结果返回给SQL。
1. 编写CLR类库
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class ApiHelper
{
// 调用外部API并返回字符串结果
public static string CallApi(string url)
{
using (HttpClient client = new HttpClient())
{
// 发送GET请求
Task<string> task = client.GetStringAsync(url);
return task.Result;
}
}
}
2. 部署与存储过程封装
将编译好的程序集开启CLR并注册,然后建立存储过程:
-- 开启CLR EXEC sp_configure 'clr enabled', 1; RECONFIGURE; -- 创建程序集(路径按实际修改) CREATE ASSEMBLY ApiLib FROM 'C:libsApiHelper.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS; -- 封装存储过程 CREATE PROCEDURE usp_CallApi @url nvarchar(200) AS EXTERNAL NAME ApiLib.[ApiHelper].CallApi;
3. 在存储过程中使用结果
调用后可将返回的JSON存入表,再用OPENJSON解析:
DECLARE @res nvarchar(max); EXEC @res = usp_CallApi 'http://127.0.0.1:5000/api/user'; INSERT INTO ApiLog(data) VALUES(@res);
二、利用外部脚本调用API
如果不想用CLR,可以开启xp_cmdshell,在存储过程里执行外部脚本,例如Python。
1. 启用xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
2. 存储过程调用Python脚本
以下脚本调用Python请求API并将结果写回数据库:
CREATE PROCEDURE usp_ApiByPy
AS
BEGIN
EXEC xp_cmdshell 'python C:scriptscall_api.py';
END;
import requests
import pyodbc
# 请求外部API
r = requests.get('http://192.168.0.1:8080/api/order')
text = r.text
# 连接数据库写回结果
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=.;DATABASE=Test;Trusted_Connection=yes')
cur = conn.cursor()
cur.execute("INSERT INTO ApiLog(data) VALUES(?)", text)
conn.commit()
三、两种方式对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| CLR集成 | 性能好,直接在库内运行 | 部署复杂,需管理程序集 |
| 外部脚本 | 灵活,可用任意语言 | 依赖外部环境,权限风险高 |
根据安全与运维要求选择合适方案,即可在SQL存储过程里稳定处理外部API调用结果。