3

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

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

  • IsDetinationPathVariable:真
  • 目标变量:用户::输出文件名
  • 覆盖目标:真
  • 描述:文件系统任务
  • 操作:重命名文件
  • IsSourcePath 变量:假
  • SourceConnection:Excel 模板复制目标

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

  • 名称:输出文件名
  • 范围:包
  • 数据类型(ValueType):字符串
  • 价值:
  • 命名空间:用户
  • EvaluateAsExpression:真
  • 只读:错误
  • 表达式:(见下文)

.

"\\\\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. 但是,由于文件系统任务失败并出现以下错误,包现在失败:

.

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 - 计算结果很好,但文件系统任务仍然会失败并出现同样的错误。

谁能指出我忽略的细节?提前致谢。

4

6 回答 6

8

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

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

于 2014-07-17T18:46:33.427 回答
2

问题是变量的范围是包,而不是任务。
更改要作用于任务的变量会导致成功执行。

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

于 2012-05-03T18:54:37.857 回答
0

您可能需要检查 SSIS 包中的“额外”变量。包范围的变量应该在任务中可用。打开“变量”窗口并单击“显示所有变量”窗口以查看您是否有两个变量 - 在不同的范围内 - 名为 OutputFileName。

显示所有变量

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

多个同名变量

希望这会有所帮助,安迪

于 2012-05-03T19:30:49.830 回答
0

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

对于我在 for each 循环中加载的变量之一,我收到了上述错误。

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

即,当在先前的 SQL 任务中使用它时,在随后的 for each 循环中将 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)
  • 从上述错误看来,使用字段作为参数会以某种方式影响查询的字段输出上的元数据。
于 2013-07-18T02:16:44.140 回答
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.
于 2013-09-24T15:38:10.313 回答
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 中,这不起作用。

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

希望有帮助。

于 2018-09-18T13:17:27.130 回答