如何在SSIS中从CSV提取值作为SQL Task参数?含日期处理及脚本示例
解决方案:从CSV内容提取日期替代文件名解析
别再依赖不靠谱的文件名规则,直接读取CSV内的日期字段并赋值给变量,再传递给SQL Task执行删除操作,从根源避免重复记录。
方法1:SSIS脚本任务(C#)
适用于SSIS环境,步骤如下:
- 创建字符串类型变量
@User::CSVReportDate(用于存储提取的日期),以及@User::CSVFilePath(存储CSV文件路径)。 - 添加脚本任务,将
@User::CSVReportDate设为ReadWriteVariables,@User::CSVFilePath设为ReadOnlyVariables。 - 编辑脚本,替换为以下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 }; } }
- 在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
相关产品推荐
相关产品推荐

