Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS 2012截断执行SQL任务的结果集_Sql_Sql Server_Ssis_Sql Server 2012_Etl - Fatal编程技术网

SSIS 2012截断执行SQL任务的结果集

SSIS 2012截断执行SQL任务的结果集,sql,sql-server,ssis,sql-server-2012,etl,Sql,Sql Server,Ssis,Sql Server 2012,Etl,在这个问题上到处寻找,找到了很多建议,但没有一个对我有用。我们有一个带有字段的表,该字段将SQL查询存储在文本类型列中,查询随后被其他对象调用,因此需要转义某些字符 我构建了一段SQL代码来完成这项工作,效果非常好。问题是,当放入执行SQL任务并将结果分配给字符串变量时,文本似乎被随机截断,例如,最近的一次尝试将4184个字符截断为4058个 我知道nvarchar在SSI中限制为4000个字符。一个建议是使用nvarchar(max)源数据类型和对象变量类型。如果出现此错误,则会失败: “将结

在这个问题上到处寻找,找到了很多建议,但没有一个对我有用。我们有一个带有字段的表,该字段将SQL查询存储在文本类型列中,查询随后被其他对象调用,因此需要转义某些字符

我构建了一段SQL代码来完成这项工作,效果非常好。问题是,当放入执行SQL任务并将结果分配给字符串变量时,文本似乎被随机截断,例如,最近的一次尝试将4184个字符截断为4058个

我知道nvarchar在SSI中限制为4000个字符。一个建议是使用nvarchar(max)源数据类型和对象变量类型。如果出现此错误,则会失败:

“将结果提取到类型为(DBTYPE_WSTR)”的变量时出错。”

另一种方法是在源查询中使用ntext。如果出现此错误,则会失败:

text、ntext和image数据类型对于局部变量无效

我错过什么了吗?将长字符串放入Execute SQL结果集变量的正确方法是什么

下面是获取SQL命令的原始代码,该代码可以工作,但会截断。在ID周围放置一个转义单引号。(这些特定ID是varchar,因为它们可以包含字母。)


请注意,它使用VARCHAR(8000),因为这是唯一似乎有效的源数据类型。

我修复了以下类似问题:

  • 在执行SQL任务-setResultSet=Full result set中,将对象变量(VObj)指定为结果集
  • 在此任务之后-创建Foreach ADO枚举器并将Vobj作为源变量()处理,将第一个变量分配给某个字符串变量
    描述了允许将长字符串(超过8K个符号)从SQL传输到SSIS字符串变量的方法。

    我倾向于使用存储过程,因此,我的执行SQL任务通常只需将参数传递给存储的进程。我没有专门尝试这些方法来解决长度问题,但在其他方面使用了类似的技术……无论如何,您可以尝试从数据库中选择数据流,然后将其放入ODBC记录集变量(对象)中如果以后需要在foreach循环或其他什么中递归。或者从源代码转到脚本组件,并使用该值设置字符串变量。我不确定如果您稍后返回并使用该变量,是否会遇到数据流源组件文本输入框上的8000个字符限制。或者立即将任务脚本化为变量…这很有效,谢谢!Matt将查询放入存储过程的方法也非常有效——实际上我已经有了一个用于其他任务的存储过程,所以我最终包含了这段代码。
    DECLARE @IDList VARCHAR(8000)
    SELECT @IDList = COALESCE(@IDList + ', ', '') + '''''' + PersonID + '''''' 
    FROM tmpGroup
    
    select '''SELECT SystemID
    FROM People
    WHERE PersonID IN (' + @IDList + ')''' AS GroupSQL