作为变量的大查询未在数据流表达式构建器SSIS中进行评估

时间:2017-01-23 12:21:27

标签: sql-server ssis

我通过SSIS(SQL 2008 R2)中的数据流中的ADO网络数据源查询缓存数据库。我想将参数传递给查询,但只能通过数据流项的表达式部分执行此操作。查询本身超过4000个字符因此我不能在其原始形式的表达式部分(由于4000字符限制)中使用该查询。

我尝试使用脚本任务将查询分配给字符串变量[User :: Query1]但是当我单击数据流的表达式构建器屏幕中的Evaluate Expression按钮时,它什么都不返回。我有[ADO NET Source]的以下表达式。[SQLCommand]:

@[User::Query1]

运行包时,我收到一条错误消息,指出SQL命令未正确设置。检查SQLCommand属性。

我将ValidateExternalMetaData设置为false,我在执行结果中看到以下错误;

Error: The variable User::Query1 contains a string that exceeds the maximum allowed length of 4000 characters.
Error: Reading the variable "User::Query1" failed with error code 0xC0047100.
Error: The expression "@[User::Query1]" on property "[ADO NET Source].[SqlCommand]" cannot be evaluated. Modify the expression to be valid.

在我的脚本任务中,我将整个查询分配给字符串变量,然后使用下面的vb代码将字符串分配给实际变量:

Dts.Variables("User::Query1").Value = sSql
MessageBox.Show(Dts.Variables("User::Query1").Value.ToString())

在脚本任务属性上,我将[User :: Query1]作为ReadWriteVariables。我还确保[User :: Query1]的EvaluateAsExpression设置为true。

本质上,我试图使用数据流的表达式属性来运行查询,因为这将允许我使用动态参数值。

4 个答案:

答案 0 :(得分:0)

SSIS中的变量也限制为4000个字符,您可以在多个子查询中拆分查询。

答案 1 :(得分:0)

我没有找到解决方案并最终下载了Sqlserver Data Tools 2014.这解决了我的问题,但现在我遇到了与ODBC源不同的问题。包导入数据然后在某个点失败,除了以下内容之外没有任何特定的错误消息:

[ODBC Source [533]] Error: Open Database Connectivity (ODBC) error occurred.
[SSIS.Pipeline] Error: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED.  The PrimeOutput method on ODBC Source returned error code 0x80004005.  The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing.  There may be error messages posted before this with more information about the failure.

进度屏幕中不显示其他错误消息

答案 2 :(得分:0)

我在使用OLE DB连接时找到了解决方案。准备工作很复杂但最终运行正常。以前,您需要使用类似且相同的结构查询定义变量,并使用< 4000个字符来验证表达式。如果一切正常,您可以在脚本任务中使用> 4000个字符查询重新定义变量。 下一个链接说明如何做到这一点。 ssis more than 4000 chars

答案 3 :(得分:0)

在SQL 2012版本之后(我认为),变量大小的限制不存在。

但是,例如在SQL 2017中,您可以将大量数据放入字符串变量中(我尝试使用超过20 MB),并且效果很好。但是,当您尝试在诸如FINDSTRING之类的表达式中对其进行字符串操作时,会出现DTS_E_EXPREVALSTRINGVARIABLETOOLONG错误。

我解决此问题的方法是使用脚本任务,因为在.NET中您没有此限制。