Teradata模式下从.NET执行SQL脚本获取双结果集的问题
解决Teradata SQL通过DataReader获取多结果集的语法问题
错误原因
当Session Mode设置为Teradata时,Teradata的SQL执行规则明确:DDL语句执行后会触发隐式提交,且DDL之后的请求中只能包含END TRANSACTION(ET)或空语句。你在Teradata Studio用「单独运行语句」模式能成功,是因为工具把每个语句拆成了独立请求;但用DataReader将整个脚本作为单个请求发送时,就触发了这个规则限制,导致报错。
解决方案
方案1:拆分请求分三次执行
将原脚本拆成三个独立的SQL请求,在同一个数据库连接(会话)中依次执行:
- 执行创建临时表语句:
CREATE VOLATILE TABLE FINAL AS ( SELECT X FROM BLAH ) WITH DATA ON COMMIT PRESERVE ROWS;
- 执行计数查询:
SELECT COUNT(*) FROM FINAL;
- 执行数据查询:
SELECT * FROM FINAL;
通过DataReader分别获取每次请求的结果集即可,注意必须保持同一个会话(连接不关闭),否则VOLATILE表会被销毁。
方案2:用存储过程封装逻辑
如果需要在单个请求中完成所有操作,可以创建存储过程封装整个逻辑,通过调用存储过程获取多结果集:
CREATE PROCEDURE GetVolatileTableData() BEGIN CREATE VOLATILE TABLE FINAL AS ( SELECT X FROM BLAH ) WITH DATA ON COMMIT PRESERVE ROWS; SELECT COUNT(*) FROM FINAL; SELECT * FROM FINAL; END;
调用存储过程:
CALL GetVolatileTableData();
存储过程内部的语句不受单个请求的DDL后语句限制,DataReader可以读取存储过程返回的多个结果集。
注意事项
- VOLATILE表是会话级临时表,仅在创建它的连接会话中有效,拆分请求时必须保证连接不中断。
- 使用存储过程时,需确保当前用户拥有创建存储过程的权限。
内容的提问来源于stack exchange,提问作者Shoebob
相关产品推荐
相关产品推荐

