能否将数据库中存储的SQL命令赋值给SSIS变量并使用
问题解答
完全可以实现将SQL命令预存在数据库表中,读取后存入SSIS变量供OLE DB源使用,你配置无法运行基本是执行时序、变量属性或组件配置细节有误,按以下流程配置即可正常运行:
标准配置流程
- 第一步:创建包级别变量
新建名为v_DynamicSQL的String类型变量,不要给该变量配置任何表达式,默认值留空即可,作用域选择整个包,不要选单个任务/容器级作用域,避免后续组件读不到变量。 - 第二步:新增前置执行SQL任务读取配置
在控制流面板最前端添加「执行SQL任务」,确保该任务的执行优先级高于后续带OLE DB源的数据流任务:- 连接管理器选择存储SQL配置表的数据库连接
- 编写查询配置表的SQL语句,例如
SELECT TargetSql FROM dbo.SsisPackageConfig WHERE TaskKey = 'OrderDailyExtract' - 结果集模式选择「单行」,在结果集映射配置页,将查询返回的SQL字段值映射到之前创建的
v_DynamicSQL变量
- 第三步:配置OLE DB源组件
打开数据流任务中的OLE DB源编辑器:- 数据访问模式选择「SQL 命令来自变量」
- 变量名下拉选择
v_DynamicSQL - 注意:首次配置元数据时,可以先给
v_DynamicSQL临时填一个硬编码的测试SQL,等列映射、下游组件元数据全部对齐后,再清空变量默认值,切回从配置表读取的模式,避免因为变量初始为空导致SSIS无法加载列元数据报错。
常见配置失败的排查点
- 执行顺序错误:读取SQL配置的执行SQL任务没有排在数据流任务之前,运行数据流时
v_DynamicSQL还是空值,自然无法执行 - 变量属性配置错误:误将
v_DynamicSQL的EvaluateAsExpression属性设为True,且绑定了固定表达式,覆盖了从数据库读取到的动态SQL值 - 元数据不匹配:配置表中存储的SQL返回的列数量、列名、数据类型、列顺序,和OLE DB源缓存的元数据不一致,触发SSIS包校验失败
- 字段类型问题:配置表中存储SQL的字段用了text/ntext等旧版大字段类型,执行SQL任务读取时出现截断、空值问题,将字段类型改为
nvarchar(max)即可解决 - 组件模式选错:OLE DB源误选了「表名来自变量」模式,而不是「SQL命令来自变量」模式,导致把存进去的SQL语句当成表名解析报错
内容的提问来源于stack exchange,提问作者Patrick Pirzer
相关产品推荐
相关产品推荐

