You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从历史表获取Snowflake中DML语句的正确处理行数

Snowflake获取DML语句实际处理行数的正确方案

information_schema.query_history()中的row_produced字段本身就不是用来统计DML处理行数的:这个字段记录的是SQL语句返回给客户端的结果集行数,普通DML执行后默认不会把受影响行作为结果集返回,所以这个字段值经常显示为0,和实际处理行数没有对应关系。

可以通过以下几种方式拿到准确的DML处理行数:

  • 方法1:使用rows_affected字段查询查询历史
    之前取数字段错误,query_history中专门有rows_affected字段记录DML实际影响的行数,覆盖INSERT、UPDATE、DELETE、MERGE所有DML类型,直接查询即可:
    SELECT
      query_id,
      query_text,
      rows_affected AS actual_processed_rows,
      row_produced AS returned_to_client_rows -- 该字段为返回客户端的行数,不要用于统计DML影响行
    FROM TABLE(information_schema.query_history())
    WHERE query_type IN ('INSERT','UPDATE','DELETE','MERGE')
      AND start_time >= DATEADD('hour', -24, CURRENT_TIMESTAMP());
    
  • 方法2:执行DML后通过RESULT_SCAN实时获取
    单条DML执行完成后,可以直接通过LAST_QUERY_ID()关联结果扫描函数,拿到当前会话最近一条DML的实际处理行数,准确性最高:
    -- 示例:执行UPDATE语句
    UPDATE user_table SET user_status = 'inactive' WHERE last_login < '2023-01-01';
    
    -- 立即查询该语句的实际影响行数
    SELECT rows_affected FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    
  • 方法3:存储过程/脚本中使用内置变量SQLROWCOUNT
    如果是在Snowflake脚本、存储过程中执行DML,可以直接调用内置变量SQLROWCOUNT获取最近一条DML的处理行数,不需要额外查表:
    BEGIN
      DELETE FROM log_table WHERE create_time < '2024-01-01';
      LET deleted_count INT := SQLROWCOUNT; -- 变量值就是刚才DELETE实际删除的行数
      RETURN deleted_count;
    END;
    

注意:如果DML语句写了RETURNING子句返回指定行数据,row_produced会记录RETURNING子句输出的行数,和实际DML处理行数可能存在差异,比如更新1000行但只RETURNING 10行时,row_produced值为10,rows_affected依然是准确的1000,统计时注意区分。

内容的提问来源于stack exchange,提问作者Sghal9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:33:27