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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:12:49