【发布时间】: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