我在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 回答
此外,SSIS中的变量限制为4000个字符,您可以在多个子查询中拆分查询 .
我没有找到解决方案,最终下载了Sqlserver Data Tools 2014.这解决了我的问题,但现在我遇到了与ODBC源不同的问题 . 包导入数据然后在某个点失败,除了以下内容之外没有任何特定的错误消息:
进度屏幕中不显示其他错误消息
我使用OLE DB连接时找到了解决方案 . 准备工作很复杂但最终运行正常 . 以前,您需要使用类似且相同的结构查询定义变量,并使用<4000个字符来验证表达式 . 如果一切正常,您可以在脚本任务中重新定义> 4000个字符查询的变量 . 下一个链接说明如何做到这一点 . ssis more than 4000 chars
在SQL 2012版本之后(我认为),不存在变量大小的限制 .
但是,例如在SQL 2017中,您可以将大量数据放入字符串变量中(我尝试使用超过20 MB)并且它可以正常工作 . 但是当你尝试对它进行字符串操作时,在像FINDSTRING这样的表达式中,你会得到DTS_E_EXPREVALSTRINGVARIABLETOOLONG错误 .
我解决这个问题的解决方案是使用脚本任务,因为在.NET中你没有这个限制 .