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

如何在SSIS中从CSV提取值作为SQL Task参数?含日期处理及脚本示例

解决方案:从CSV内容提取日期替代文件名解析

别再依赖不靠谱的文件名规则,直接读取CSV内的日期字段并赋值给变量,再传递给SQL Task执行删除操作,从根源避免重复记录。

方法1:SSIS脚本任务(C#)

适用于SSIS环境,步骤如下:

  1. 创建字符串类型变量@User::CSVReportDate(用于存储提取的日期),以及@User::CSVFilePath(存储CSV文件路径)。
  2. 添加脚本任务,将@User::CSVReportDate设为ReadWriteVariables,@User::CSVFilePath设为ReadOnlyVariables。
  3. 编辑脚本,替换为以下C#代码(根据实际CSV结构调整列索引/列名):
using System;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;

namespace ST_CSVDateExtractor
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            string csvPath = Dts.Variables["User::CSVFilePath"].Value.ToString();
            string reportDate = string.Empty;

            // 读取CSV,跳过表头取第一行数据
            using (StreamReader sr = new StreamReader(csvPath))
            {
                sr.ReadLine(); // 跳过表头
                string dataRow = sr.ReadLine();
                if (!string.IsNullOrEmpty(dataRow))
                {
                    // 按逗号分割,假设日期是第3列(索引2),处理可能的引号
                    string[] columns = dataRow.Split(',');
                    reportDate = columns[2].Trim('"');
                    
                    // 可选:格式转换,确保和数据库字段匹配
                    // reportDate = DateTime.ParseExact(reportDate, "MM/dd/yyyy", null).ToString("yyyy-MM-dd");
                }
            }

            Dts.Variables["User::CSVReportDate"].Value = reportDate;
            Dts.TaskResult = (int)ScriptResults.Success;
        }

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
    }
}
  1. 在SQL Task中使用变量构建删除语句:
DELETE FROM YourTargetTable
WHERE ReportDate = ?

然后在参数映射中,将@User::CSVReportDate映射到该参数。

方法2:PowerShell脚本(通用环境)

如果不用SSIS,用PowerShell直接处理并执行SQL:

# 读取CSV,提取第一行的ReportDate字段
$csvPath = "C:\YourData\SupplierFile.csv"
$csvData = Import-Csv -Path $csvPath
$reportDate = $csvData[0].ReportDate

# 可选:转换日期格式
# $reportDate = Get-Date $reportDate -Format "yyyy-MM-dd"

# 执行SQL删除
$connectionString = "Server=YourSQLServer;Database=YourDatabase;Integrated Security=True;"
$sqlQuery = "DELETE FROM YourTargetTable WHERE ReportDate = @ReportDate"

$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$cmd = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $conn)
$cmd.Parameters.AddWithValue("@ReportDate", $reportDate)

$conn.Open()
$cmd.ExecuteNonQuery()
$conn.Close()

关键注意事项

  • 确认CSV内所有行的日期一致,若存在多日期需额外处理逻辑(比如取最小/最大日期,或批量删除)。
  • 务必保证提取的日期格式与数据库字段格式匹配,不一致时要在脚本中做格式转换。
  • 调整脚本中的列索引或列名,完全匹配你的CSV结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:33:25