【问题标题】:SSIS 2012 truncates result set of Execute SQL taskSSIS 2012 截断执行 SQL 任务的结果集
【发布时间】:2016-12-27 02:48:28
【问题描述】:

在这方面进行了上下搜索,发现了很多建议,但没有什么对我有用。我们有一个表,其字段在文本类型列中存储 SQL 查询,该查询随后被其他对象调用,因此需要转义某些字符。

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

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

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

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

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

我错过了什么吗?将长字符串放入 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),因为这是唯一可行的源数据类型。

【问题讨论】:

  • 我倾向于为此使用存储过程,因此我的执行 SQL 任务通常只需将参数传递给存储过程。
  • 我没有专门尝试过这些想法来解决长度问题,但对其他事情使用了类似的技术......无论如何,您可以尝试使用数据流从您的数据库中进行选择,然后放入 ODBC如果您需要稍后在 foreach 循环或其他内容中递归,则记录集变量(对象)。或者您从源代码转到脚本组件并使用该值设置一个字符串变量。如果您稍后转身并使用该变量,我不确定您是否会遇到数据流源组件文本输入框中的 8000 个字符限制。或者立即将任务脚本化...

标签: sql sql-server ssis sql-server-2012 etl


【解决方案1】:

我用以下解决了类似的问题:

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

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

【讨论】:

  • 行得通,谢谢! Matt 将查询放入存储过程的方法也很有效——我实际上已经有一个用于其他任务的存储过程,所以我最终包含了那段代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多