SSIS文件系统任务错误:分配给变量...的值的类型与当前变量类型不同

时间:2012-05-03 18:27:41

标签: ssis sql-server-2008-r2

好的......我有一个相对简单的SSIS包(DTSDesigner100,Visual Studio 2008版本9.0.30729.4462 QFE,.NET Framework 3.5 SP1)。在SSIS控制流程结束时,文件系统任务重命名文件操作。

此文件系统任务的属性如下:

  • IsDetinationPathVariable:True
  • DestinationVariable:User :: OutputFileName
  • OverwriteDestination:True
  • 描述:文件系统任务
  • 操作:重命名文件
  • IsSourcePathVariable:False
  • SourceConnection:Excel模板复制目的地

没有已定义的表达式。如您所见,我将Destination指定为变量User :: OutputFileName。那么让我们看看那个变量......

  • 名称:OutputFileName
  • 范围:包
  • 数据类型(ValueType):字符串
  • 价值:
  • 命名空间:用户
  • EvaluateAsExpression:True
  • ReadOnly:False
  • 表达:(见下文)

"\\\\SERVER\\Folder\\" + "MyAwesomeExcelWorkbook_"
+ (DT_WSTR,4)DATEPART("year", GETDATE())+ "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mm", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("dd", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("hh", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mi", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("ss", GETDATE()), 2)
+ ".xlsx"

所以我可以成功评估这个表达式。每次程序包运行(并且失败)时,它的Value都是计算表达式的值,正如人们所期望的那样。

当我运行包时,会发生什么......

  1. 之前的步骤成功运行。
  2. 文件系统任务启动,文件已成功重命名。
  3. 但是,程序包现在失败,因为文件系统任务失败并出现以下错误:
  4. Error: 0xC001F009 at Package: The type of the value being assigned to variable "User::OutputFileName" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
    Task failed: Rename Excel Workbook
    Error: 0xC0019001 at Rename Excel Workbook: The wrapper was unable to set the value of the variable specified in the ExecutionValueVariable property.
    Warning: 0x80019002 at Package: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (4) 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.
    

    我在这里忘记了一些细微的细节。现在,我已经尝试将整个表达式转换为DT_WSTR,512 - 评估得很好,但文件系统任务仍将失败并出现相同的错误。

    任何可以指出我忽略的细节的人?提前谢谢。

6 个答案:

答案 0 :(得分:5)

我也遇到了同样的错误。我使用“执行SQL任务”来运行存储过程,从中使用单行结果集值来设置SSIS包变量。存储过程中的变量声明为“varchar(max)”,我将它们分配给定义为“string”的包级变量。

所以我尝试将存储过程声明更改为varchar(512)和“VOILA”......不再有错误。实际上......它也适用于varchar(8000)和nvarchar(4000)...但是SSIS没有像varchar(max)。

答案 1 :(得分:2)

问题是变量的作用域是Package,而不是任务 将要作用域的变量更改为任务会导致成功执行。

编辑:我想我需要问 - 为什么?老实说,这并不符合我对SSIS的理解 - 自从每次Denali CTP推出以来我都使用过SSIS。在幕后发生的事情导致这对于任务范围的变量来说是一个很大的变化,而不是在文件系统任务中使用的包范围的?在某些任务之外没有问题,但是当我在某些任务中使用它们时会有一个问题。发生了什么事?

答案 2 :(得分:0)

您可能想要检查SSIS包中的“额外”变量。应该在任务中提供包范围的变量。打开Variables窗口并单击“Show All Variables”窗口,查看是否有两个变量(在不同的范围内)命名为OutputFileName。

Show All Variables

由于变量是在SSIS中通过名称标识的,因此较低范围的变量(例如包含文件系统任务的序列容器)将有效地拦截包范围变量的变量标识变量的名称相同:

Multiple Variables of the same name

希望这有帮助, 安迪

答案 3 :(得分:0)

我想添加一些信息,这是我当前问题的最接近的描述,希望它能帮助别人。我从参数化的SQL任务中加载一个记录集对象,然后在recorset上使用for for each循环并将字段加载到变量中。

我收到了针对每个循环中加载的变量之一的上述错误。

当我更改填充记录集的之前的 SQL任务时,问题就消失了。

即。在先前的SQL任务中使用它时,在每个循环中将COL2加载到后续变量中时会导致错误:

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = ''

(或)

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = N''

这样就停止了错误发生:

SELECT COL1, COL2 FROM Table WHERE COL2 = ?

SSIS中的参数功能令人失望。

  • 无法将参数放入选择部分
  • 无法围绕参数
  • 包装转换函数
  • 无法使用UDF中的参数或任何明显复杂的查询
  • 需要根据驱动程序查找深奥的参数代码(OLEDB / ADO.Net / ODBC)
  • 从上面的错误中可以看出,使用参数字段会以某种方式影响查询字段输出的元数据。

答案 4 :(得分:0)

我收到以下异常。我已经解决了。     我将解释我的问题和步骤     已采取解决问题的方法。

    **Error Message :** The type of the value being assigned to 
variable differs from the current variable type..



              **When :** Executing SSIS package. SSIS package is calling batch script. 
        Batch script is calling Python script. SSIS package is expecting output from 
    batch file. After executing the batch file and python script output 
should be delivered to SSIS package.  But Here I am getting the exception.

    **Python Script writing output into stdout :** 
    //Python code start
    print >>sys.stdout, "output" 
    //Python code End
    So here the output is written to standard out.

        **Issue :**  When I am calling the batch file, I am writing the log 
into one log file.
    Please check the following batch script.
    //Batch File script start
    C:\Python25\python.exe GetValFromPYthonSCript.py > scriptLog.txt  
    //Batch File script End
        So what happend is, the output is written in the log.But again 
I tried to read the output using the following line in SSIS.
    //SSIS coding start
    Dim objProcess As Process
    objProcess = New Process()
    objProcess.StartInfo.FileName = "batchFile location"
    objProcess.start()
    System.Windows.Forms.MessageBox.Show(objProcess.StandardOutput.ReadLine())
    //SSIS coding End

    So when I am trying to display I am getting the above exception.

    **Fix** : Just I have removed the log. I did not write the output into the log file.
    C:\Python25\python.exe GetValFromPYthonSCript.py
    Now I am getting the output properly.

答案 5 :(得分:0)

SQL Server 2016 VS2015社区14.0.25431.01 U3 SSDT 14.0.61712.050

这个人使我的大脑发痒的时间比我想承认的要长。我有两个软件包,每个软件包都有一个过程,该过程返回分配给变量的不同sql语句。其中一个软件包有效,而其中一个无效。

在工作包/过程中,我将变量@sql声明为varchar(max)。进一步在查询中,我添加了一个回溯日期,该日期存储为变量@dt varchar(7)。我正在将@dt连接到@sql

在无效的程序包/过程中,我将变量@sql声明为varchar(max)。进一步在此查询中,我添加了回溯日期,该日期存储为变量@dt varchar(max)。在SSMS中,此过程有效并返回可执行的语句。但是,在SSIS中,这不起作用。

一旦我将后一个变量更改为较短的字符长度(varchar(7)),VS中的任务/变量分配就成功了。

希望有帮助。