我正在学习SSIS,这似乎是一件容易的事,但我被困住了。
我有一个包含此数据的CSV文件Orders.csv:
ProductId,Quantity,CustomerId
1,1,104
2,1,105
3,2,106
我还有一个存储过程ssis_createorder,它作为输入参数: @productid int @quantity int @customerid int
我想要做的是创建一个SSIS包,它将.csv文件作为输入,并为.csv文件中的每一行调用ssis_createorder三次(第一行包含列名)。
这是我到目前为止所做的。
我创建了一个SSIS包(Visual Studio 2005& SQL Server 2005)。
在控制流程中,我有一个数据流任务。
数据流有我的.csv文件的平面文件源。所有列都已映射。
我创建了一个名为Order类型的变量。我还有变量CustomerId,ProductId和&数量类型int32。
接下来,我有一个Recordset Destination,它将.csv文件的内容分配给varialbe命令。我不确定如何使用这个工具。我将VariableName(在Customer Properties下)设置为User :: orders。我认为现在订单包含一个由原始.csv文件中的内容组成的ADO记录集。
接下来,我在Control Flow标记上添加ForEach循环容器,并将其链接到数据流任务。
ForEach循环容器内部我将Enumerator设置为“ForEach ADO Enumerator”。我正在将“ADO对象源变量”设置为User :: orders“。对于Enumeration模式,我选择”第一个表中的行“。
在变量映射选项卡中,我有User :: ProductId索引0,User :: Quantity索引1,User :: CustomerId索引2.我不确定这是否正确。
接下来,我在ForEach循环容器中有一个脚本任务。
我将ReadOnlyVariables设置为ProductId。
在Main方法中,这就是我正在做的事情:
Dim sProductId As String = Dts.Variables("ProductId").Value.ToString
MsgBox("sProductId")
当我运行包时,我的ForEach循环容器变为亮红色,我收到以下错误消息
Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::ProductId" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 1 to variable "User::ProductId" cannot be applied.
Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::Quantity" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 2 to variable "User::Quantity" cannot be applied.
Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::CustomerId" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 3 to variable "User::CustomerId" cannot be applied.
Warning: 0x80019002 at MasterTest: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED. The Execution method succeeded, but the number of errors raised (12) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
SSIS package "Package.dtsx" finished: Failure.
Dts.TaskResult = Dts.Results.Success
任何帮助将不胜感激
答案 0 :(得分:6)
我的一位同事给我答案。
您不需要ForEach循环容器或RecordSet容器。
您只需要平面文件源和OLE DB命令。连接到您的数据库并在OLE DB Command内部选择适当的连接。
在“组件属性”中,输入以下SQLCommand:
exec ssis_createorder ?, ?, ?
“?”是参数的占位符。
“列映射”选项卡下的“下一步”将.csv文件列映射到存储过程参数。
您已完成并继续运行该程序包。
感谢Gary,如果你在StackOverFlow,我会给你一个upvote并接受你的答案。
答案 1 :(得分:2)
如果我理解正确,您要做的是对数据源中的每一行执行3次存储过程。
如果您只是使用平面文件数据源创建数据流并通过3个执行sql命令任务管道数据,该怎么办?只需将数据中的列映射到存储过程的输入参数即可。
也许我在你的问题中没有正确看到它并且我认为太简单了,但根据我的经验,你需要尽可能避免在SSIS中使用foreach任务。
答案 2 :(得分:1)
我怀疑您需要查看数据流任务。源CSV文件中的值可能被解释为字符串值。您可能需要派生列组件或数据转换组件才能将输入值转换为所需的数据类型。
而且,我认为@StephaneT的解决方案对于执行SP会很好。
答案 3 :(得分:1)
我不确定这是否能回答你的问题。但我希望这样做,我使用BULK INSERT命令实现了它。我创建了一个包含csv文件中所有列的临时表,而不是存储过程,而是使用INSTEAD OF INSERT触发器来处理将其插入到许多表中的逻辑。