SSIS C#脚本任务无数据时无法生成含表头CSV文件的问询
问题原因
当表中无数据时,执行select ceiling(count(*)/...)得到的LoopCnt值为0,导致后续的for (int fileloop = 1; fileloop <= LoopCnt; fileloop++)循环完全不会触发,创建CSV文件、写入表头的代码根本没机会执行,所以没有生成任何文件。
修复方案
需要调整逻辑,确保即使表中没有数据,也能执行一次文件创建和表头写入操作,以下是两种可行的修改方式:
方式一:强制无数据时触发一次循环
在获取LoopCnt后,判断其值为0时强制设为1,让循环至少执行一次:
//Get the Count of Sheets need to be created SqlCommand cmd = myADONETConnection.CreateCommand(); cmd.CommandText = query; LoopCnt = (decimal)cmd.ExecuteScalar(); // 新增:无数据时强制LoopCnt为1,确保循环执行一次 if (LoopCnt == 0) { LoopCnt = 1; }
方式二:单独处理无数据场景
在原循环结束后,判断如果LoopCnt为0,则单独执行写表头的逻辑:
// 原循环代码保持不变 // 新增:无数据时单独生成带表头的文件 if (LoopCnt == 0) { // 查询表结构(即使无数据,DataTable也会包含列信息) string queryString = $"SELECT TOP 0 * FROM {TableName}"; SqlDataAdapter adapter = new SqlDataAdapter(queryString, myADONETConnection); DataSet ds = new DataSet(); adapter.Fill(ds); foreach (DataTable d_table in ds.Tables) { string FileFullPath = DestinationFolder + "\\" + FileNamePart + "_" + datetime + FileExtension; using (StreamWriter sw = new StreamWriter(FileFullPath, false)) { // 写入表头 int ColumnCount = d_table.Columns.Count; for (int ic = 0; ic < ColumnCount; ic++) { sw.Write(d_table.Columns[ic]); if (ic < ColumnCount - 1) { sw.Write(FileDelimiter); } } sw.Write(sw.NewLine); } } Dts.TaskResult = (int)ScriptResults.Success; }
额外优化提示
- 原代码中
startRowCnt和endRowCnt变量未在分页查询中使用,导致每次循环都会导出全表数据,会造成重复导出问题,建议补充分页逻辑(比如使用OFFSET ... FETCH NEXT ...语法)。 - 建议用
using语句管理StreamWriter、SqlDataAdapter等资源,确保资源自动释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者kucluk
相关产品推荐
相关产品推荐

