2016-08-19 105 views
0

在此搜索了高和低,并且发现了很多建议,但没有任何对我有用的建议。我们有一个表格,其中包含一个字段,用于将SQL查询存储在文本类型列中,然后查询随后由其他对象调用,因此需要转义某些字符。SSIS 2012截断了执行SQL任务的结果集

我构建了一段SQL代码来做到这一点非常好。问题是,当放入执行SQL任务并将结果分配给String变量时,文本会在表面上随机被截断,例如。最近的尝试将截断的4184个字符截断为4058.

我知道nvarchar在SSIS中限制为4000个字符。一个建议是使用nvarchar(max)源数据类型和Object变量类型。失败并出现此错误:

“将结果抽取到类型变量(DBTYPE_WSTR)”时发生错误。

另一个是在源查询中使用ntext。失败并出现此错误:

“文本,ntext和图像数据类型对于局部变量无效。”

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

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

DECLARE @IDList VARCHAR(8000) 
SELECT @IDList = COALESCE(@IDList + ', ', '') + '''''' + PersonID + '''''' 
FROM tmpGroup 

select '''SELECT SystemID 
FROM People 
WHERE PersonID IN (' + @IDList + ')''' AS GroupSQL 

注意它使用VARCHAR(8000),因为这似乎工作的唯一来源的数据类型。

+2

我倾向于为此使用存储过程,所以我的执行SQL任务通常只需将参数传递给存储过程。 –

+0

我还没有专门尝试这些想法来解决长度问题,但已使用类似的技术用于其他事情......无论如何,你可以尝试一个数据流从你的数据库中选择,然后放置在一个ODBC Recordset变量(对象),如果你需要稍后在foreach循环中进行递归或其他操作。或者你从源代码到脚本组件,并设置一个字符串变量的值。我不确定是否会遇到或不会遇到数据流源组件文本输入框中的8000个字符限制,如果您转过身并稍后使用该变量。或脚本任务马上变量... – Matt

回答

0

我固定类似的问题有以下:

  1. 在执行SQL任务 - 设置结果集=完整结果集并分配对象变量(VObj)作为结果集。
  2. 完成此任务后 - 创建Foreach ADO枚举器并将Vobj作为源变量(see good walk through article),将第一个变量赋值给某个String变量。

所描述的方法允许将长的(多于8K个符号)字符串从SQL传输到SSIS字符串变量中。

+0

这工作,谢谢! Matt将查询放入存储过程的方法非常好 - 我其实已经有了一个用于其他任务的存储过程,所以我最终包含了这段代码。 –