我已经设置了一个sql任务,它将完整的名称结果集加载到一个对象变量中,我将它连接到一个foreach循环,逐行扫描整个对象。我不确定接下来的步骤。如果我可以创建一个数据流任务,并以某种方式设置目标变量等于每个循环映射变量,这将是很好的。有小费吗?
答案 0 :(得分:0)
根据您的描述,您需要做的就是:
1:execute SQL task
返回您已经拥有的Excel文件名列表。
将输出连接到Foreach Loop Container
并开始迭代每个名称。
在容器内部,您需要的第一个任务是Script Task
,用于创建每个Excel文件。
我认为excel格式对于您需要填充的所有内容都是相同的。您需要创建一个具有指定所需列标题名称的新模板。
对于script task
,将容器中的映射变量作为read only
变量,您需要创建另一个变量,将其设置为read and write
,假设它被命名为A
;用于存储每个动态excel文件路径,并编辑脚本。
如果您熟悉C#
,则每个迭代名称的Copy
模板都很容易。
代码将是这样的:
Using System.IO;
...
...
...
string source = "C:\\template.xlsx";//need to be a full path
string target = "C:\\" + Dts.Variables["that read only variable"].Value.Tostring() + ".xlsx"
File.Copy(source,target );
Dts.Variables["A"].Value = target; //important!
在Script task
之后,需要一个约束数据流任务,在其中,您需要一个excel destination
,棘手的部分是(1):您需要设置动态ExcelFile path
excel connection manager
的属性,我建议第一次使用现有的Excel来缓存映射,然后对于动态连接部分,选择A
,这是read and write
变量来自script task
1}}。
要将数据填充为Excel,您需要将所有varchar
类型转换为nvarchar
,这可以使用derived column
或data conversion
<来完成/ p>
最后但同样重要的是,为delay validation
,TRUE
和整个connection manager
设置excel destination
为data flow task
,这非常重要动态过程。
以上所述可能只是一个简短的解释,但这是主要的想法。
PS:(1)Excel在SSIS中非常挑剔,如果您没有安装数据访问引擎,可能无法成功填充数据。对于excel,可能需要.JET
(较旧)或.ACE
(较新)提供商。
(2)如果您的标题行不仅仅位于第1行,您可能还需要考虑OPENROWSET
属性。