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

如何通过Web API获取Excel文件并导入SQL Server为可读格式?

步骤1:修正API调用逻辑,获取并保存二进制Excel文件

你的当前代码使用responseText获取响应,这会导致二进制Excel文件损坏——因为responseText仅适用于文本类响应。必须改用responseBody获取二进制内容,再通过ADODB.Stream写入本地文件(需确保SQL Server服务账号拥有目标文件夹的读写权限):

DECLARE @Object AS INT;
DECLARE @ResponseBody AS VARBINARY(MAX); -- 用VARBINARY存储二进制Excel内容
DECLARE @Body AS VARCHAR(8000) = 
'{
"StartDt": "2024-08-01",
"EndDt":"2024-08-02"
}'

-- 初始化XMLHTTP对象并发送请求
EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'POST','http://10.116.34.8:8129/runreport/ad17bc11-67ea-4f3e-b210-333e78ec9e9c', 'false';
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json';
EXEC sp_OAMethod @Object, 'send', null, @body;

-- 获取二进制响应体(关键:替换responseText为responseBody)
EXEC sp_OAMethod @Object, 'responseBody', @ResponseBody OUTPUT;

-- 用ADODB.Stream写入Excel文件
DECLARE @Stream INT;
EXEC sp_OACreate 'ADODB.Stream', @Stream OUT;
EXEC sp_OAMethod @Stream, 'Open';
EXEC sp_OAMethod @Stream, 'Type', NULL, 1; -- 1代表二进制类型
EXEC sp_OAMethod @Stream, 'Write', NULL, @ResponseBody;
EXEC sp_OAMethod @Stream, 'SaveToFile', NULL, 'D:\Temp\Report.xlsx', 2; -- 2表示覆盖现有文件
EXEC sp_OAMethod @Stream, 'Close';

-- 释放所有COM对象
EXEC sp_OADestroy @Stream;
EXEC sp_OADestroy @Object;

替换D:\Temp\Report.xlsx为实际可写入的路径,若使用远程服务器文件需用UNC路径(如\\ServerName\Share\Report.xlsx)。

步骤2:将Excel文件导入SQL Server表(可读格式)

使用OPENROWSET直接读取Excel文件并导入到数据库表,前提是已安装Microsoft Access Database Engine(ACE驱动),且SQL Server启用了Ad Hoc Distributed Queries:

先启用Ad Hoc Distributed Queries(仅需执行一次)

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

导入数据到新表

SELECT *
INTO dbo.ReportData -- 自定义新表名
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0 Xml;HDR=YES;Database=D:\Temp\Report.xlsx', -- HDR=YES表示Excel第一行是表头
    'SELECT * FROM [Sheet1$]' -- 替换Sheet1为实际工作表名称
);

导入数据到现有表

INSERT INTO dbo.ExistingReportTable (列名1, 列名2, 列名3) -- 替换为目标表的列名
SELECT 对应Excel列1, 对应Excel列2, 对应Excel列3 -- 替换为Excel中的对应列
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0 Xml;HDR=YES;Database=D:\Temp\Report.xlsx',
    'SELECT * FROM [Sheet1$]'
);

注意事项:

  • 64位SQL Server需安装64位ACE驱动,32位则安装32位驱动
  • 若遇到权限问题,可在SQL Server配置管理器中,将服务启动账号改为本地系统或具备足够权限的域账号

内容的提问来源于stack exchange,提问作者Boris Garkoun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:34:56