确定受 SQL 语句影响的行数

执行 DML 命令 后(不包括 TRUNCATE TABLE 命令),Snowflake Scripting 会设置以下全局变量。您可以使用这些变量来判断上一条 DML 语句是否影响了任何行,或者查询返回了多少行数据。

变量

描述

ACTIVITY_COUNT

受上一条 DML 语句影响的行数,或上一条 SELECT 查询返回的行数。在每个语句执行后设置。

SQLROWCOUNT

受最后一个 DML 语句影响的行数。

这相当于 JavaScript 存储过程中的 getNumRowsAffected()

SQLFOUND

如果最后一个 DML 语句影响一行或多行,则为 true

SQLNOTFOUND

如果最后一个 DML 语句影响零行,则为 true

备注

2025_01 行为变更捆绑包 可用于更改这些变量的行为。启用捆绑包后,且在 Snowflake Scripting 块或存储过程中的最后一个 DML 语句之后执行非 DML 语句时,变量会返回 NULL。默认情况下,该捆绑包处于启用状态。有关行为变更的更多信息,请参阅 Snowflake Scripting:全局变量变更(待定)

如果捆绑包已禁用,您可以通过执行以下语句 在您的账户中将其启用

SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

要禁用捆绑包,请执行以下语句:

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

本节中的示例使用下表:

CREATE OR REPLACE TABLE my_values (value NUMBER);

以下示例使用 SQLROWCOUNT 变量返回受最后一个 DML 语句(INSERT 语句)影响的行数。

BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
END;

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQL、Classic Console,或者 execute_streamexecute_string 方法,请改用本示例(请参阅 Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
END;
$$;
+-----------------+
| anonymous block |
|-----------------|
|               3 |
+-----------------+

以下示例使用 SQLFOUNDSQLNOTFOUND 变量返回受最后一个 DML 语句(UPDATE 语句)影响的行数。

BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQL、Classic Console,或者 execute_streamexecute_string 方法,请改用本示例(请参阅 Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;
$$;

当匿名块运行时,SQLFOUND 变量是 true,因为 UPDATE 语句更新了两行。

+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+

查询表以查看当前值:

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     4 |
|     4 |
|     3 |
+-------+

再次运行相同的匿名块,结果如下:

  • 执行 UPDATE 语句,因为表中存在大于 2 的值。也就是说,IF 条件得到了满足。

  • SQLNOTFOUND 变量是 true,因为没有行被更新。UPDATE 语句未更新任何行,因为表中的值都不小于 ``3``(在 WHERE 子句中指定)。

该查询会返回以下输出:

+------------------+
| anonymous block  |
|------------------|
| No rows updated. |
+------------------+

现在,更新表,将所有值设置为 1

UPDATE my_values SET value = 1;

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     1 |
|     1 |
|     1 |
+-------+

再次运行相同的匿名块,不执行 UPDATE 语句,因为表中的值都不大于 2。也就是说,IF 条件没有满足,因此 UPDATE 语句没有执行。

+-----------------------------+
| anonymous block             |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+

ACTIVITY_COUNT 示例

SQLROWCOUNT 不同,ACTIVITY_COUNT 变量会在每条语句(包括 SELECT 查询)执行后进行设置。这使得它既适用于跟踪 DML 操作所影响的行数,也适用于跟踪查询返回的行数。

以下示例演示了 INSERT 语句和 SELECT 查询后的 ACTIVITY_COUNT 变量。

BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQL、Classic Console,或者 execute_streamexecute_string 方法,请改用本示例(请参阅 Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):

EXECUTE IMMEDIATE $$
BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;
$$;

INSERT 之后,ACTIVITY_COUNT3``(插入了三行)。SELECT 之后,:code:`ACTIVITY_COUNT` ``2``(两行匹配 ``WHERE value > 1 条件)。

+-------------------------------------------+
| anonymous block                           |
|-------------------------------------------|
| Inserted 3 rows, query returned 2 rows.   |
+-------------------------------------------+