SSIS执行SQL任务获取PostgreSQL自增ID赋值变量报错如何解决
解决方案
[Execute SQL Task] 错误:为变量"varjobactivityid"赋值时发生错误:"值不在预期范围内。"
1. 修正SQL语句写法
PostgreSQL的RETURNING子句是INSERT语句的原生组成部分,不能拆分到独立语句执行。你之前的写法在INSERT末尾加了分号,相当于把插入和返回拆成两条语句执行,自然无法拿到返回的自增ID。修正后的拼接逻辑如下:
"INSERT INTO table1 (targettable,filename,processeddatetimeutc) VALUES ('tablename', '" + @[User::filename]+ "', '" + (DT_STR, 30, 1252) GETUTCDATE()+ "') RETURNING activityid as id"
注意去掉INSERT语句末尾的分号,把RETURNING直接跟在插入逻辑后面。
2. 调整ODBC驱动配置
值类型不匹配、返回结果异常的问题基本都是PostgreSQL ODBC驱动默认配置导致的,按以下步骤调整即可:
- 打开ODBC数据源管理器,找到你连接PostgreSQL使用的DSN,点击「配置」
- 找到「Options」-「Page 2」设置项,勾选Use Declare/Fetch和Server side prepare两个选项
- 保存配置后重启SSIS开发环境生效
3. 结果集映射调整
执行SQL任务的配置保持以下参数即可:
- ResultSet设置为
SingleRow - 结果集映射规则中,把返回的列名
id直接对应到变量User::varjobactivityid,优先用列名匹配不要用序号0映射,避免ODBC驱动返回列顺序异常
4. 兼容备选方案
如果上述RETURNING方案还是不生效,可以用CTE把插入和返回逻辑封装成单条查询语句,适配ODBC驱动的结果集识别规则:
"WITH insert_op AS ( INSERT INTO table1 (targettable,filename,processeddatetimeutc) VALUES ('tablename', '" + @[User::filename]+ "', '" + (DT_STR, 30, 1252) GETUTCDATE()+ "') RETURNING activityid ) SELECT activityid as id FROM insert_op"
5. ExecValueVariable异常说明
ExecValueVariable返回的是ODBC驱动执行语句后的受影响行数,所以你拿到的固定值1是正常结果,该参数设计上就不用于返回查询结果,不要用它来接收自增ID。
内容的提问来源于stack exchange,提问作者MadhusudhanKaka
相关产品推荐
相关产品推荐

