Sql server SSI使用.CSV文件SQL Server 2005中的参数执行存储过程

Sql server SSI使用.CSV文件SQL Server 2005中的参数执行存储过程,sql-server,sql-server-2005,ssis,Sql Server,Sql Server 2005,Ssis,我正在学习SSIS,这似乎是一项简单的任务,但我被卡住了 我有一个CSV文件Orders.CSV,其中包含以下数据: ProductId,Quantity,CustomerId 1,1,104 2,1,105 3,2,106 我还有一个存储过程ssis_createorder,它将以下参数作为输入参数: @productid int @数量整数 @客户ID int 我要做的是创建一个SSIS包,该包将.csv文件作为输入,并为.csv文件中的每一行调用SSIS_createorder三次。第一

我正在学习SSIS,这似乎是一项简单的任务,但我被卡住了

我有一个CSV文件Orders.CSV,其中包含以下数据:

ProductId,Quantity,CustomerId
1,1,104
2,1,105
3,2,106
我还有一个存储过程ssis_createorder,它将以下参数作为输入参数: @productid int @数量整数 @客户ID int

我要做的是创建一个SSIS包,该包将.csv文件作为输入,并为.csv文件中的每一行调用SSIS_createorder三次。第一行包含列名

以下是我迄今为止所做的工作

我已经创建了一个SSIS包VisualStudio2005和SQLServer2005

在控制流中,我有一个数据流任务

数据流有一个平面文件源my.csv文件。所有列都已映射

我已经创建了一个名为orders of type Object的变量。我还有类型为int32的CustomerId、ProductId和Quantity变量

接下来,我有一个记录集目标,它将.csv文件的内容分配到varialbe订单中。我不知道如何使用这个工具。我正在将Customer属性下的VariableName设置为User::orders。我认为现在orders拥有一个ADO记录集,由原始.csv文件的内容组成

接下来,我将在控制流标记上添加一个ForEach循环容器,并将其链接到数据流任务

在ForEach循环容器内部,我将枚举器设置为ForEach ADO枚举器。我正在将ADO对象源变量设置为User::orders。对于枚举模式,我选择第一个表中的行

在变量映射选项卡中,我有User::ProductId索引0、User::Quantity索引1、User::CustomerId索引2。我不确定这是否正确

接下来,我在ForEach循环容器中有一个脚本任务

我已将ReadOnlyVariables设置为ProductId

在主要方法中,这是我正在做的:

 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

如果我理解正确,您需要做的是为数据源中的每一行执行一个存储过程3次,我将不胜感激

如果您只是使用平面文件数据源创建一个数据流,并通过3个执行sql命令任务传递数据,会怎么样?只需将数据中的列映射到存储过程的输入参数


也许我在您的问题中没有正确地看到这一点,而且我的想法太简单了,但根据我的经验,您需要尽可能避免在SSIS中使用foreach任务。

如果我理解正确,您要做的是为数据源中的每行执行一个存储过程3次

如果您只是使用平面文件数据源创建一个数据流,并通过3个执行sql命令任务传递数据,会怎么样?只需将数据中的列映射到存储过程的输入参数


也许我在你的问题中没有正确地看到这一点,我的想法太简单了,但根据我的经验,你需要尽可能避免在SSIS中使用foreach任务。

我的一位同事刚刚给了我答案

您不需要ForEach循环容器或记录集容器

您所需要的只是平面文件源和OLEDB命令。连接到数据库,并在OLE DB命令中选择适当的连接

在组件属性中,输入以下SQLCommand:

exec ssis_createorder ?, ?, ? 
那个?是参数的占位符

接下来,在“列映射”选项卡下,将.csv文件列映射到存储过程参数

您完成了,继续运行包


谢谢Gary如果你在StackOverFlow,我会给你投票并接受你的答案

我的一位同事刚刚给了我答案

您不需要ForEach循环容器或记录集容器

您所需要的只是平面文件源和OLEDB命令。连接到数据库,并在OLE DB命令中选择适当的连接

在组件属性中,输入以下SQLCommand:

exec ssis_createorder ?, ?, ? 
那个?是参数的占位符

接下来,在“列映射”选项卡下,将.csv文件列映射到存储过程参数

您完成了,继续运行包


谢谢Gary如果你在StackOverFlow,我会给你投票并接受你的答案

我怀疑您需要查看数据流任务。很可能源CSV文件中的值被解释为字符串值。您可能需要一个派生列组件或数据转换组件来将输入值转换为所需的数据类型


而且,我认为@StephaneT的解决方案将有助于执行SP。

我怀疑您需要查看数据流任务。很可能源CSV文件中的值被解释为字符串值。您可能需要一个派生列组件 t或数据转换组件,将输入值转换为所需的数据类型


而且,我认为@StephaneT的解决方案对于执行SP是有好处的。

我不确定这是否回答了您的问题。但我正打算这样做,我使用bulkinsert命令实现了这一点。我创建了一个包含csv文件中所有列的暂存表,并使用instead of INSERT触发器代替存储过程来处理将其插入多个表的逻辑。

我不确定这是否回答了您的问题。但我正打算这样做,我使用bulkinsert命令实现了这一点。我创建了一个包含csv文件中所有列的暂存表,并使用instead of INSERT触发器代替存储过程来处理将其插入多个表的逻辑。

+1我认为foreach任务可以工作,但您的解决方案节省了一些工作。无论如何,您必须为文件中的每一行运行一次SP。@bobs您不认为我的答案是最好的吗?这两种解决方案听起来很相似。看起来在数据流中只需要一个OLE DB命令组件。当然可以在一个任务中调用3个存储过程,但这样做并不明显,因为您要做三件独立的事情:+1我认为foreach任务可以工作,但您的解决方案节省了一些工作。无论如何,您必须为文件中的每一行运行一次SP。@bobs您不认为我的答案是最好的吗?这两种解决方案听起来很相似。不过,在数据流中似乎只需要一个OLE DB命令组件。当然,您可以在一个任务中调用3个存储过程,但这样做并不十分明显,因为您要做三件独立的事情:这似乎是处理数据最有效的方法。确保数据类型匹配。这似乎是处理数据最有效的方法。确保您的数据类型匹配。