来自SSIS包的ForEach循环容器映射变量在SQL Server存储过程中不起作用

时间:2014-03-11 19:55:54

标签: sql-server tsql stored-procedures ssis mapping

我有一个SSIS包,它使用ForEach循环容器来枚举目录中的Excel文件。我还有一个任务流,可以将这些Excel文件中的数据插入到SQL Server中。

我试图通过在我的存储过程中使用映射变量将文件名插入到SQL Server中的同一个表中的列中。

我在脚本结尾处遇到了使用红色波浪线的MappingVariable时出现问题。以下是我的存储过程脚本。

CREATE PROCEDURE [dbo].[Insert_F_STG_v2]
    @Hrs float,
    @Type nvarchar(100),
    @SN nvarchar(100),
    @Op nvarchar(100),
    @[USER::CurrentFileName]  
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [CRM_RC].[dbo].[F_StgTbl]([Hrs], [Type], [SN], [Op], [Report_Date])
    VALUES (@Hrs, @Type, @SN, @Op, @[USER::CurrentFileName])
END

脚本底部的值块中的最后一个@[USER::CurrentFileName]是给我提出问题的那个。

以下是错误:

  

Msg 102,Level 15,State 1,Procedure Insert_F_STG_v2,Line 95
  ' USER :: CurrentFileName'。

附近的语法不正确

3 个答案:

答案 0 :(得分:2)

您需要将派生列添加到数据流中,并将User::CurrentFileName分配给新列,然后在列映射中包含此新列。

在存储过程中,将@[USER::CurrentFileName]更改为适当的SQL类型,例如@filename nvarchar(255)

建议:您也可以取消存储过程,并通过使用SQL目标而不是为每一行执行过程直接插入表中(因为它的批量插入会更快)。

答案 1 :(得分:0)

@[USER::CurrentFileName]不是有效的参数名称,并且您没有为其分配数据类型。 SQL Server将[USER::CurrentFileName]视为数据类型,因此失败。

最后,您似乎正在尝试将该值插入[Report_Date]列。我不确定Date和Filename如何兼容。

答案 2 :(得分:0)

您需要做的是创建第二个变量,从您的文件名中解析有用的信息。在一个单独的变量中,从@[USER::CurrentFileName]解析日期,然后在此proc中使用该变量。我会更具体,但我不知道你的文件是如何命名的。