能否通过JavaScript API获取CREATE TABLE AS语句的插入行数?
问题解答
核心结论
对于CREATE TABLE AS SELECT (CTAS)这类语句,Snowflake的JavaScript存储过程API无法直接通过getNumRowsAffected()、getRowCount()等方法获取插入的行数,必须执行额外的SELECT COUNT(*)查询来统计行数。
原因说明
Snowflake中,CTAS属于DDL(创建表)+数据填充的组合操作,并非纯DML(如INSERT/UPDATE/MERGE)操作。Snowflake的Statement API仅会为纯DML操作返回受影响行数,CTAS这类操作的执行结果不会在Statement对象中记录行数统计信息,所以你尝试的方法均无法生效。
可行解决方案
在执行CTAS语句后,新增一条SELECT COUNT(*)查询来获取目标表的行数,示例代码如下:
CREATE OR REPLACE Procedure TEST() returns STRING language JAVASCRIPT as $$ const rawSelectInto = ` CREATE OR REPLACE TEMPORARY TABLE MYTABLE1 AS SELECT TOP 2 URI FROM MYTABLE2; `; // 执行CTAS创建临时表 snowflake.createStatement({ sqlText: rawSelectInto }).execute(); // 查询临时表的行数 const countStmt = snowflake.createStatement({ sqlText: "SELECT COUNT(*) FROM MYTABLE1" }); const countResult = countStmt.execute(); countResult.next(); // 定位到结果行 const rowCount = countResult.getColumnValue(1); return `Rows inserted: ${rowCount}`; $$; CALL TEST();
补充说明
- 由于你使用的是TEMPORARY TABLE,每个会话的临时表相互独立,无需担心并发修改导致行数统计不准确的问题。
- 如果是永久表,可将操作包裹在事务中,确保CTAS和COUNT查询的原子性。
内容的提问来源于stack exchange,提问作者Hoppe
相关产品推荐
相关产品推荐

