首页 文章

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

提问于
浏览
0

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

我已经尝试使用脚本任务将查询分配给字符串变量[User :: Query1]但是当我单击数据流的表达式构建器屏幕中的“评估表达式”按钮时,它不返回任何内容 . 我有[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

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

  • 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.
    

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

  • 0

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

  • 0

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

    但是,例如在SQL 2017中,您可以将大量数据放入字符串变量中(我尝试使用超过20 MB)并且它可以正常工作 . 但是当你尝试对它进行字符串操作时,在像FINDSTRING这样的表达式中,你会得到DTS_E_EXPREVALSTRINGVARIABLETOOLONG错误 .

    我解决这个问题的解决方案是使用脚本任务,因为在.NET中你没有这个限制 .

相关问题