我有一个要求,在CSV文件的顶部添加小摘要。然后,我需要在其正下方显示详细的行数据。这就是我想制作的东西:
我尝试在SSIS中执行此操作,需要以CSV格式输出。数据源是SQL Server。我已经考虑过使用UNIONALL来实现这一点,但我还需要按照第6行在文件中显示列标题。有什么办法吗?谢谢
hivapdat1#
您很幸运,这是SSIS能够生成混合输出文件的罕见情况。你有三个,三个!!,这里有不同的选项
双数据流方法。这里的技巧是创建两个不同的平面文件连接管理器,它们指向磁盘上的同一个物理文件。Header定义将首先执行,并填充前N行,不写入任何标题行。Body定义将包含带有标题行的预期数据。
我们将使用两个数据流来实现这一点。我有一个生成键/值对的源代码,如
SELECT * FROM ( VALUES ('agent_name', '123456') ,('bordereau_year', '2023') ,('bordereau_month', '1') )D(ckey,cvalue);
我将平面文件目标配置为覆盖
已使用第一行中的列名配置平面文件连接管理器。
源数据看起来像
SELECT * FROM ( VALUES (NEWID(), 'ABC',NULL,'B123') ,(NEWID(), 'BCA',NULL,'B234') )D(uuid,sub_agent_name,broker_reference,policy);
我使用
平面文件目标指定为
运行该包并获得如下输出
agent_name,123456 bordereau_year,2023 bordereau_month,1 uuid,sub_agent_name,broker_reference,policy {7A769E78-4D08-43E1-9710-799FA9F93A08},ABC,,B123 {D8FA71FB-748A-4FF3-8AA4-902F48F4992B},BCA,,B234
这将替换第一个数据流,并利用平面文件连接管理器的Header属性。在这里,我创建了一个名为@[User::HeaderData]的变量,并在表达式中使用
Header
"agent_name,123456 bordereau_year,2023 bordereau_month,1"
您不需要使用表达式,但如果它是静态数据,则当您粘贴到Value中时,换行符将被删除。它将保存在表达式中。如果内容需要是动态的,那么您需要做一些事情来构建它,然后分配给Value属性。哦,如果你走这条路,你会想要检查身体上的“第一行的列名”。
该方法是选项1的不同实现。无论如何获取数据,然后让一个C#任务将数据写入文件。
System.IO.File.WriteAllText("C:\\ssisdata\\output\so_76908880.csv", "Content here");
1条答案
按热度按时间hivapdat1#
您很幸运,这是SSIS能够生成混合输出文件的罕见情况。
你有三个,三个!!,这里有不同的选项
选项一
双数据流方法。这里的技巧是创建两个不同的平面文件连接管理器,它们指向磁盘上的同一个物理文件。Header定义将首先执行,并填充前N行,不写入任何标题行。Body定义将包含带有标题行的预期数据。
DFT Header
我们将使用两个数据流来实现这一点。
我有一个生成键/值对的源代码,如
我将平面文件目标配置为覆盖
已使用第一行中的列名配置平面文件连接管理器。
DFT Body
源数据看起来像
我使用
平面文件目标指定为
运行该包并获得如下输出
选项二
这将替换第一个数据流,并利用平面文件连接管理器的
Header
属性。在这里,我创建了一个名为@[User::HeaderData]的变量,并在表达式中使用您不需要使用表达式,但如果它是静态数据,则当您粘贴到Value中时,换行符将被删除。它将保存在表达式中。
如果内容需要是动态的,那么您需要做一些事情来构建它,然后分配给Value属性。
哦,如果你走这条路,你会想要检查身体上的“第一行的列名”。
选项三
该方法是选项1的不同实现。
无论如何获取数据,然后让一个C#任务将数据写入文件。