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

如何在TSQL中拆分API返回的CSV字符串并写入MSSQL数据表

MSSQL 解析接口返回 CSV 数据入库解决方案

前置依赖检查

你用到的 sp_OACreate 相关存储过程需要先开启 Ole Automation Procedures,已开启可跳过以下执行语句:

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;

完整可运行代码

核心用XML实现多字符分隔符拆分,兼容SQL Server 2012及以上所有版本,无需额外依赖:

DECLARE @fromTime NVARCHAR(MAX)
DECLARE @toTime NVARCHAR(MAX)
DECLARE @URL2 NVARCHAR(MAX)

-- 提前建好目标表,建表参考:
-- CREATE TABLE Eirgrid_Co2Data (
--     [DATE & TIME] DATETIME,
--     [CO2 INTENSITY (gCO2/kWh)] INT,
--     [REGION] NVARCHAR(50)
-- )

SET @fromTime = REPLACE(FORMAT(DATEADD(DAY, -1, GETDATE()), 'dd-MMM-yyyy 00:00' ), ' ','%20')
SET @toTime = REPLACE(FORMAT(DATEADD(DAY, -1,GETDATE()), 'dd-MMM-yyyy 23:59' ), ' ','%20')

SELECT @URL2 = 
CONCAT('http://smartgriddashboard.eirgrid.com/DashboardService.svc/csv?area=co2Intensity&region=ALL&datefrom=',@fromTime,'&dateto=',@toTime)

DECLARE @URL NVARCHAR(MAX) = @URL2
DECLARE @Object as Int;
-- 原VARCHAR(8000)容量不足,替换为MAX类型兼容全天数据
DECLARE @ResponseText as NVARCHAR(MAX);
DECLARE @currenttime as datetime;
SET @currenttime = GETDATE()

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'get',
   @URL,
   'False'
EXEC sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

IF((SELECT @ResponseText) <> '')
BEGIN
    DECLARE @xml XML
    -- 替换双空格行分隔符为XML节点标记,构造可解析XML结构
    SET @xml = CAST('<rows><row>' + REPLACE(@ResponseText, '  ', '</row><row>') + '</row></rows>' AS XML)

    ;WITH split_rows AS (
        SELECT 
            LTRIM(RTRIM(row.value('.', 'NVARCHAR(MAX)'))) AS row_content
        FROM @xml.nodes('/rows/row') AS T(row)
        WHERE LEN(LTRIM(RTRIM(row.value('.', 'NVARCHAR(MAX)')))) > 0
        AND row.value('position()[1]', 'INT') > 1 -- 跳过第一行表头
    ),
    split_cols AS (
        SELECT
            -- 按逗号拆分三列,去首尾空格
            LTRIM(RTRIM(PARSENAME(REPLACE(row_content, ',', '.'), 3))) AS data_time,
            LTRIM(RTRIM(PARSENAME(REPLACE(row_content, ',', '.'), 2))) AS co2_intensity,
            LTRIM(RTRIM(PARSENAME(REPLACE(row_content, ',', '.'), 1))) AS region
        FROM split_rows
    )
    -- 测试可先替换INSERT为SELECT查看结果是否正确
    INSERT INTO Eirgrid_Co2Data ([DATE & TIME], [CO2 INTENSITY (gCO2/kWh)], [REGION])
    SELECT 
        TRY_CAST(data_time AS DATETIME),
        TRY_CAST(co2_intensity AS INT),
        region
    FROM split_cols
     
END
ELSE
BEGIN
 DECLARE @ErroMsg NVARCHAR(30) = 'No data found.';
 PRINT @ErroMsg;
END
EXEC sp_OADestroy @Object

注意事项

  • 若后续字段扩展超过4列,把PARSENAME拆列逻辑替换为XML拆列即可,无需修改整体结构
  • TRY_CAST会自动跳过格式异常的行,避免单次拉取全量失败
  • 部署到SQL Agent Job时,确保运行账号有Ole Automation Procedures执行权限和目标表写入权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:27:02