SSIS文件系统任务错误:分配给变量...的值的类型与当前变量类型不同
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS文件系统任务错误:分配给变量...的值的类型与当前变量类型不同相关的知识,希望对你有一定的参考价值。
好的......我有一个相对简单的SSIS包(DTSDesigner100,Visual Studio 2008版本9.0.30729.4462 QFE,.NET Framework 3.5 SP1)。在SSIS结束时,包的控制流是文件系统任务,它是重命名文件操作。
此文件系统任务的属性如下:
- IsDetinationPathVariable:True
- DestinationVariable:User :: OutputFileName
- OverwriteDestination:True
- 描述:文件系统任务
- 操作:重命名文件
- IsSourcePathVariable:错误
- SourceConnection:Excel模板复制目标
没有定义的表达式。如您所见,我将Destination指定为变量User :: OutputFileName。那么让我们来看看那个变量......
- 名称:OutputFileName
- 适用范围:包装
- 数据类型(ValueType):字符串
- 值:
- 命名空间:用户
- EvaluateAsExpression:True
- ReadOnly:错
- 表达:(见下文)
.
"\\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"
所以我可以成功地评估这个表达式。每次程序包运行(并失败)时,其值都是计算表达式的值,正如人们所期望的那样。
当我运行包时,这是发生的事情......
- 前面的步骤成功运行。
- 文件系统任务启动,文件已成功重命名。
- 但是,程序包现在失败,因为文件系统任务失败并出现以下错误:
.
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 - 评估得很好,但文件系统任务仍然会失败并出现相同的错误。
谁可以指出我忽略的细节?提前致谢。
我也遇到了同样的错误。我使用“执行SQL任务”来运行存储过程,从中使用单行结果集值来设置SSIS包变量。存储过程中的变量声明为“varchar(max)”,我将它们分配给定义为“string”的包级变量。
所以我尝试将存储过程声明更改为varchar(512)和“VOILA”...没有更多错误。实际上......它也适用于varchar(8000)和nvarchar(4000)...但是SSIS没有像varchar(max)那样。
问题是变量的作用域是Package,而不是任务。 将要作用域的变量更改为任务会导致成功执行。
编辑:我想我需要问 - 为什么?老实说,这并不符合我对SSIS的理解 - 自从每次Denali CTP推出以来我都使用过SSIS。在幕后发生了什么导致这对于任务范围的变量来说是一个很大的变化,而不是在文件系统任务中使用的包范围的变量?在某些任务之外没有问题,但是当我在某些任务中使用它们时会有一个问题。这是怎么回事?
您可能想要检查SSIS包中的“额外”变量。应该在任务中提供包范围的变量。打开Variables窗口并单击“Show All Variables”窗口,查看是否有两个变量(在不同的范围内)命名为OutputFileName。
由于变量在SSIS中通过名称标识,因此较低范围的变量(例如包含文件系统任务的序列容器)将有效地拦截包范围变量的变量标识(如果两个变量的名称相同:
希望这会有所帮助,安迪
我想补充一些信息,这是我当前问题的最接近的描述,希望它能帮助别人。我从参数化的SQL任务加载一个记录集对象,然后在recorset上使用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)
- 从上面的错误看来,使用参数字段以某种方式影响查询字段输出的元数据。
我收到以下异常。我已经解决了。我将解释我为解决问题所采取的问题和步骤。
**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:Python25python.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:Python25python.exe GetValFromPYthonSCript.py
Now I am getting the output properly.
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中的任务/变量赋值成功。
希望有所帮助。
以上是关于SSIS文件系统任务错误:分配给变量...的值的类型与当前变量类型不同的主要内容,如果未能解决你的问题,请参考以下文章