CREATE TASK¶
在当前/指定的架构中创建新任务或替换现有任务。
此命令还支持以下变体:
CREATE TASK ... CLONE(创建现有任务的克隆)
重要
新创建任务或克隆任务在创建时会被暂停。有关运行已暂停任务的信息,请参阅 ALTER TASK ... RESUME 或 EXECUTE TASK。
语法¶
CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
[ { WAREHOUSE = <string> } | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
[ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
[ CONFIG = <configuration_string> ]
[ ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE ]
[ <session_parameter> = <value> [ , <session_parameter> = <value> ... ] ]
[ USER_TASK_TIMEOUT_MS = <num> ]
[ SUSPEND_TASK_AFTER_NUM_FAILURES = <num> ]
[ ERROR_INTEGRATION = <integration_name> ]
[ COMMENT = '<string_literal>' ]
[ FINALIZE = <string> ]
[ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ AFTER <string> [ , <string> , ... ] ]
[ WHEN <boolean_expr> ]
AS
<sql>
变体语法¶
CREATE TASK ... CLONE
创建具有相同参数值的新任务:
CREATE [ OR REPLACE ] TASK <name> CLONE <source_task> [ ... ]
有关更多详细信息,请参阅 CREATE <object> ... CLONE。
备注
使用 CREATE TASK <name> CLONE 克隆任务或克隆包含任务的架构时,除非显式覆盖,否则会复制所有基础任务属性。
必填参数¶
name
指定任务标识符的字符串;对于在其中创建任务的架构必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(如
"My object"
)。放在双引号内的标识符也区分大小写。有关更多详细信息,请参阅 标识符要求。
sql
以下任意一项:
单一 SQL 语句
调用存储过程
使用 Snowflake Scripting 的过程逻辑
Snowsight 不支持创建或修改任务以使用 Snowflake Scripting。请改用 SnowSQL 或其他命令行客户端。
SQL 代码在任务运行时执行。在任务中使用之前,请验证
{sql}
是否按预期执行。备注
无服务器任务支持使用 Java 或 Python 外部函数。但是,无服务器任务不能调用在 Snowflake 内部开发的以下对象类型和函数:
包含 Java 或 Python 代码的 UDFs(用户定义的函数)。
以 Scala(使用 Snowpark)编写的存储过程,或者调用包含 Java 或 Python 代码的 UDFs 的存储过程。
可选参数¶
WAREHOUSE = string
或 . USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
WAREHOUSE = string
指定为任务运行提供计算资源的虚拟仓库。
若省略此参数,可在运行此任务时使用无服务器计算资源。Snowflake 会根据每个工作负载的需要,从大小上自动调整和扩展无服务器计算资源。当为任务指定了计划时,Snowflake 会调整资源大小,以便在指定的时间范围内完成任务的未来运行。要指定任务的初始仓库大小,请设置
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
参数。USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
仅适用于 Serverless Task。
指定要为首次运行任务预配的计算资源的大小,然后 Snowflake 可以使用任务历史记录来确定理想大小。任务成功完成几次运行后,Snowflake 将忽略此参数设置。
请注意,如果任务历史记录不适用于给定任务,则计算资源将还原为此初始大小。
备注
如果指定了
WAREHOUSE = string
参数值,则设置此参数将产生用户错误。大小等同于创建仓库(使用 CREATE WAREHOUSE)时可用的计算资源,如
SMALL
、MEDIUM
或LARGE
。参数支持的最大大小为XXLARGE
。如果省略该参数,则使用中型 (MEDIUM
) 仓库执行任务的第一次运行。您可以在任务创建 之后、成功运行一次 之前 更改初始大小(使用 ALTER TASK)。在此任务的首次运行启动后更改该参数,这对当前或未来任务运行的计算资源没有影响。
请注意,暂停和恢复任务不会移除用于调整计算资源大小的任务历史记录。仅当重新创建任务(使用 CREATE OR REPLACE TASK 语法)时,才会移除任务历史记录。
有关此参数的详细信息,请参阅 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE。
SCHEDULE ...
指定定期运行任务的计划:
备注
必须 为 任务图 中的独立任务或根任务定义计划;否则只有在使用 EXECUTE TASK 手动执行时,任务才会运行。
不能 为任务图中的子任务指定计划。
USING CRON expr time_zone
指定用于定期运行任务的 cron 表达式和时区。支持标准 cron 实用程序语法的子集。
有关时区列表,请参阅 ` tz 数据库时区列表 <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones (link removed)>`_ (在维基百科中)。
cron 表达式由以下字段组成:
# __________ minute (0-59) # | ________ hour (0-23) # | | ______ day of month (1-31, or L) # | | | ____ month (1-12, JAN-DEC) # | | | | _ day of week (0-6, SUN-SAT, or L) # | | | | | # | | | | | * * * * *
支持以下特殊字符:
*
通配符。指定字段的任何出现。
L
代表“last”。在星期几字段中使用时,它允许您指定结构,例如给定月份的“最后一个星期五”(“5L”)。在日期字段中,它指定该月的最后一天。
/n
指示给定时间单位的第 n 个实例。每个时间量子都是独立计算的。例如,如果在月份字段中指定
4/3
,则任务将安排在 4 月、7 月和 10 月执行(即从一年中的第 4 个月开始,每 3 个月一次)。在随后的几年中保持相同的计划。也就是说,任务 不会 安排在 1 月(10 月运行后 3 个月)运行。
备注
cron 表达式当前仅根据指定的时区进行计算。更改账户的 TIMEZONE 参数值(或在用户或会话级别设置该值) :emph:` 不会 ` 更改任务的时区。
cron 表达式定义任务的所有 :emph:` 有效 ` 运行时间。Snowflake 尝试根据此计划运行任务;但是,如果在下一个有效运行时间开始之前未完成上一次运行,则跳过任何有效运行时间。
当 cron 表达式中同时包含一个月中的特定日期和一周中的某一天时,任务将安排在满足一个月中某一天条件 :emph:` 或 ` 一周中某一天条件的日期运行。例如,
SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'
计划在每月的任何 10 到 20 天以及这些日期之外任何星期二或星期四的 0AM 运行任务。cron 中最短的时间粒度为分钟。如果任务在其 cron 表达式中定义的分钟内恢复,则该任务的第一次计划运行就是 cron 表达式实例的下一次出现。例如,如果计划在每天午夜 (
USING CRON 0 0 * * *
) 运行的任务在午夜过后 5 秒 (00:00:05
) 恢复,则第一次任务运行将在下一个午夜开始。
num MINUTE
指定在任务运行之间插入的等待时间间隔(以分钟为单位)。仅接受正整数。
还支持
num M
语法。为避免歧义,在以下情况下需设置 基本间隔时间:
任务恢复时(使用 ALTER TASK ...RESUME) :emph:` 或 `
当设置不同的间隔时(使用 ALTER TASK ...SET SCHEDULE)
基本间隔时间从当前时钟时间开始间隔计数器。例如,如果将 INTERVAL 值设置为
10
,并且在 9:03 AM 启用任务,则任务将在 9:13 AM、9:23 AM 运行,以此类推。请注意,我们尽最大努力确保绝对精度,但仅保证任务不会在设定的时间间隔到达 之前 执行。例如,在当前示例中,任务可以首先在 9:14 AM 运行,但不会在 9:12 AM 运行。备注
支持的最大值为
11520
(8 天)。num MINUTE
值超过此值的任务永远不会运行。
CONFIG = configuration_string
指定任务图中所有任务都可以访问的键值对的字符串表示形式。必须采用 JSON 格式。如需详细了解如何获取当前正在运行的任务的配置字符串,请参阅 SYSTEM$GET_TASK_GRAPH_CONFIG。
备注
此参数只能在根任务上设置。该设置应用于任务图中的所有任务。
可以在独立任务上设置此参数,但此参数不影响任务行为。Snowflake 会确保在给定时间仅运行独立任务的一个实例。
ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE
指定是否允许任务图的多个实例同时运行。
备注
此参数只能在根任务上设置。该设置应用于任务图中的所有任务。
可以在独立任务上设置此参数,但此参数不影响任务行为。Snowflake 会确保在给定时间仅运行独立任务的一个实例。
TRUE
可确保在给定时间只有一个根任务实例在运行。如果根任务在下一个计划运行时间到来时仍在运行,则会跳过该计划时间。此保证不扩展到子任务。如果在根任务的下一次计划运行发生时,子任务的当前运行仍在进行中,则任务图的另一个实例将会开始。FALSE
确保一次只允许运行特定任务图的一个实例。只有在该任务图中的所有子任务都运行完毕后,才会安排根任务的下一次运行。这意味着,如果运行任务图中所有任务所需的累积时间超过了根任务定义中设置的明确计划时间,则至少会跳过任务图的一次运行。
默认:
FALSE
session_parameter = value [ , session_parameter = value ... ]
指定任务运行时要为会话设置的会话参数的逗号分隔列表。任务支持所有会话参数。有关完整列表,请参阅 会话参数。
USER_TASK_TIMEOUT_MS = num
指定任务超时前单次运行的时间限制(以毫秒为单位)。
备注
在大幅提升任务的时间限制之前,请考虑是否可以(通过重写语句或使用存储过程)优化任务启动的 SQL 语句,或是否应增大仓库大小。
在某些情况下,STATEMENT_TIMEOUT_IN_SECONDS 参数优先于 USER_TASK_TIMEOUT_MS。有关详细信息,请参阅 STATEMENT_TIMEOUT_IN_SECONDS。
有关此参数的详细信息,请参阅 USER_TASK_TIMEOUT_MS。
值:
0
-86400000
(1 天)。默认值:
3600000
(1 小时)SUSPEND_TASK_AFTER_NUM_FAILURES = num
指定当前任务在任务连续多少次运行失败后会自动暂停。失败的任务运行包括任务主体中的 SQL 代码产生用户错误或超时的运行。由于系统错误而跳过、取消或失败的任务运行被视为不确定,不会包含在失败的任务运行次数中。
在任务图中的独立任务或根任务上设置此参数。将此参数设置为大于
0
的值时,以下行为适用于独立任务或任务图的运行:在连续任务运行失败或超时达到指定次数后,独立任务会自动暂停。
任务图中的 任何 单个任务连续运行失败或超时达到指定次数后,根任务将自动暂停。
当此参数设置为
0
时,不会自动暂停失败的任务。该设置应用于依赖无服务器计算资源或虚拟仓库计算资源的任务。
有关此参数的详细信息,请参阅 SUSPEND_TASK_AFTER_NUM_FAILURES。
值:
0
- 无上限。默认:
10
ERROR_INTEGRATION = 'integration_name'
仅当将任务配置为使用 Amazon Simple Notification Service (SNS)、Microsoft Azure 事件网格或 Google Pub/Sub 发送错误通知时才是必需的。
指定用于与 Amazon SNS、MS Azure 事件网格或 Google Pub/Sub 通信的通知集成的名称。有关更多信息,请参阅 为任务启用错误通知。
COMMENT = 'string_literal'
指定任务的注释。
默认:无值
AFTER string [ , string , ... ]
指定当前任务的一个或多个前置任务。使用此选项可创建 任务图,或将此任务添加到现有任务图中。任务图是一系列任务,从计划的根任务开始,并通过依赖关系链接在一起。
请注意,任务图的结构可以在创建其所有组成任务之后定义。执行 ALTER TASK ...ADD AFTER 语句,为规划的任务图中的每个任务指定前置任务。
一项任务在其所有前置任务成功完成自己的运行后运行(在短暂滞后之后)。
备注
根任务应具有明确的计划。每个子任务都必须有一个或多个已定义的前置任务(使用
AFTER
参数指定),才能将任务链接在一起。一个任务最多可有 100 个前置任务和 100 个子任务。此外,任务图最多 总共 可有 1000 个处于已恢复或已暂停状态的任务(包括根任务)。
账户目前最多可有 30000 个已恢复的任务。
任务图中的所有任务都必须具有相同的任务所有者。单个角色必须对任务图中的所有任务都具有 OWNERSHIP 权限。
任务图中的所有任务必须存在于同一架构中。
在重新创建 任何 任务(使用 CREATE OR REPLACE TASK 语法)或者添加(使用 CREATE TASK ...AFTER 或 ALTER TASK ...ADD AFTER)或移除子任务(使用 ALTER TASK ... REMOVE AFTER)之前,必须暂停根任务。
如果任务图中的任意任务被克隆,则默认情况下,克隆该任务的角色将成为克隆任务的所有者。
如果原始任务的所有者创建了克隆,则克隆任务将保留原始任务与前置任务之间的链接。这意味着同一个前置任务同时触发原始任务和克隆任务。
如果其他角色创建了克隆,则克隆任务可以有计划,但不能有前置任务。
当前限制:
Snowflake 保证,在给定时间最多有一个具有定义计划的任务实例正在运行;但是,对于具有已定义前置任务的任务,我们无法提供相同的保证。
WHEN boolean_expr
指定一个布尔 SQL 表达式;支持用 AND/OR 联接的多个条件。当任务被触发时(基于其
SCHEDULE
或AFTER
设置),它会验证表达式的条件以确定是否执行。如果 :emph:` 不 ` 满足表达式的条件,则任务跳过当前运行。将此任务标识为前置任务的任何任务也都不会运行。任务 WHEN 子句支持以下内容:
SYSTEM$STREAM_HAS_DATA 支持用于在 SQL 表达式中进行评估。
此函数指示指定的流是否包含变更跟踪数据。在开始当前运行之前,可以使用此函数评估指定的流是否包含变更数据。如果结果为 FALSE,则任务不会运行。
备注
SYSTEM$STREAM_HAS_DATA 旨在避免返回 FALSE 值(即使流包含变更数据)。但是,当流不包含变更数据时,此函数不能保证避免返回 TRUE 值。
SYSTEM$GET_PREDECESSOR_RETURN_VALUE 支持用于在 SQL 表达式中进行评估。
此函数检索任务图中前置任务的返回值。 返回值可用作布尔表达式的一部分。 使用 SYSTEM$GET_PREDECESSOR_RETURN_VALUE 时,如果需要,可以将返回值转换为相应的数值、字符串或布尔类型。
简单示例包括:
WHEN NOT SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::BOOLEAN
WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name') != 'VALIDATION'
WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::FLOAT < 0.2
备注
不支持在 TASK ... WHEN 表达式中使用 PARSE_JSON,原因是它需要基于仓库的计算资源。
布尔运算符,例如 AND、OR、NOT 等。
在数值、字符串和布尔类型之间进行转换。
比较运算符,例如 equal、not equal、greater than、less than 等。
在对 WHEN 表达式的条件进行验证时,不需要计算资源。验证改为在云服务层中处理。每次任务评估其 WHEN 条件且未运行时,都会产生象征性费用。每次触发任务时,费用都会累积,直到任务运行为止。届时,费用将转换为 Snowflake Credit,并添加到任务运行的计算资源使用量中。
通常,与任务执行时间相比,用于验证条件的计算时间微不足道。最佳实践是,尽可能使计划的任务运行时间和实际的任务运行时间保持一致。避免与任务运行不一致的任务计划。例如,如果大约每 24 小时将数据插入具有流的表中一次,则不要安排每分钟检查一次流数据的任务。每次运行时用于验证 WHEN 表达式的费用通常微不足道,但费用会累积。
请注意,如果云服务的每日消耗量低于 计算资源每日使用量的 10% 配额,则不会累积云服务费用。
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
指定 标签 名称和标签字符串值。
标签值始终为字符串,标签值的最大字符数为 256。
有关在语句中指定标签的信息,请参阅 对象和列的标签配额。
FINALIZE = string
指定与终结器任务关联的根任务的名称。终结器任务在任务图中的所有其他任务运行完成之后运行。您可以定义终结器任务的 SQL,来处理任务图所使用的通知以及资源的释放和清理。有关更多信息,请参阅 终结器任务。
一个根任务只能有一个终结器任务。如果为一个根任务创建多个终结器任务,则任务创建将失败。
终结器任务不能有任何子任务。任何尝试将终结器任务设为前置任务的命令都将失败。
终结器任务不能有计划。如果创建带有计划的终结器任务,将会失败。
默认:无值
TASK_AUTO_RETRY_ATTEMPTS = num
指定任务图自动重试的次数。如果任何任务图在 FAILED 状态下完成,Snowflake 可以自动从失败的图中的最后一个任务重试任务图。
任务图自动重试功能默认处于禁用状态。要启用此功能,请在任务图的根任务上将 TASK_AUTO_RETRY_ATTEMPTS 设置为大于
0
的值。请注意,此参数必须设置为任务图的根任务。如果设置为子任务,则会返回错误。
值:
0
–30
。默认:
0
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
EXECUTE MANAGED TASK |
账户 |
仅对依赖于无服务器计算资源来运行的任务是必需的。 |
CREATE TASK |
架构 |
|
USAGE |
仓库 |
仅对依赖用户管理的仓库进行运行的任务是必需的。 |
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
任务使用任务所有者的权限运行。有关运行任务所需的最低权限列表,请参阅 任务安全性。
在将 SQL 语句或存储过程包含在任务定义中 之前,请以任务所有者角色的身份运行该语句或调用该存储过程,以确保角色对 SQL 或存储过程引用的对象具有所需的权限。
对于无服务器任务:
用于任务的无服务器计算资源的范围相当于
XSMALL
到XXLARGE
的仓库大小。要请求增加大小,请联系 ` Snowflake 支持部门 `_。任务图中的单个任务可以使用无服务器或用户管理的计算资源。不需要对任务图中的 所有 任务使用无服务器计算。
如果任务失败并出现意外错误,您可以收到有关该错误的通知。有关配置任务错误通知的更多信息,请参阅 为任务启用错误通知。
默认情况下,如果 DML 语句在未显式启动事务的情况下执行,则在语句结束时,如果成功则自动提交,如果失败则回滚。此行为称为 自动提交,使用 AUTOCOMMIT 参数进行控制。此参数 必须 设置为 TRUE。如果 AUTOCOMMIT 参数在账户级别设置为 FALSE,则对于单个任务,将该参数设置为 TRUE(使用 ALTER TASK ...SET AUTOCOMMIT = TRUE);否则,任务执行的任何 DML 语句都将失败。
只有一个任务应该使用流中的数据。为同一个表创建多个流,供多个任务使用。当任务在使用 DML 语句的流中使用数据时,流将推进偏移,并且变更数据不再可供下一个任务使用。
当您使用
CREATE OR REPLACE
语法时,Snowflake 会删除现有任务,并使用指定的定义重新创建它。替换任务时,请考虑以下行为:默认情况下,重新创建的任务处于暂停状态。
任何正在进行的任务运行均已完成。要停止任务运行,请使用 SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS 函数。
如果重新创建了独立任务或根任务,则将取消该任务的下一次计划运行。
CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。
具有大型定义的任务可能会导致错误。如果由于任务大小而出现错误,请尝试使用存储过程或降低任务定义的复杂性。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
示例¶
单一 SQL 语句¶
创建一个 Serverless Task,从星期天 9 AM 开始到 5 PM 结束(America/Los_Angeles 时区),每小时查询一次当前时间戳。
初始仓库大小为 XSMALL:
CREATE TASK t1
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
SELECT CURRENT_TIMESTAMP;
与上一个示例相同,但该任务依赖于用户管理的仓库来提供用于运行的计算资源:
CREATE TASK mytask_hour
WAREHOUSE = mywh
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
AS
SELECT CURRENT_TIMESTAMP;
其他时间安排示例:
SCHEDULE 值 |
描述 |
---|---|
|
每一分钟。UTC 时区。 |
|
每天凌晨 2 AM 点。UTC 时区。 |
|
每天两次,分别在 5 AM 和 5 PM(整点)。UTC 时区。 |
|
在 6 月最后一天的 2:30 AM。UTC 时区。 |
创建一个 Serverless Task,该任务每小时将当前时间戳插入表中一次。该任务会为运行任务的会话设置 TIMESTAMP_INPUT_FORMAT 参数。此会话参数指定插入时间戳的格式:
CREATE TASK t1
SCHEDULE = '60 MINUTE'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
创建一个任务,该任务每 5 分钟将当前时间戳插入表中一次:
CREATE TASK mytask_minute
WAREHOUSE = mywh
SCHEDULE = '5 MINUTE'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
创建一个任务,该任务每 5 分钟将流中 INSERT 操作的变更跟踪数据插入表中一次。该任务使用 SYSTEM$STREAM_HAS_DATA 函数轮询流以确定是否存在变更数据,如果结果为 FALSE
,则跳过当前运行:
CREATE TASK mytask1
WAREHOUSE = mywh
SCHEDULE = '5 minute'
WHEN
SYSTEM$STREAM_HAS_DATA('MYSTREAM')
AS
INSERT INTO mytable1(id,name) SELECT id, name FROM mystream WHERE METADATA$ACTION = 'INSERT';
在任务图中创建无服务器子任务,并添加多个前置任务。子任务仅在所有指定的前置任务成功完成自己的运行后运行。
假设任务图的根任务是 task1
,并且 task2
、task3
和 task4
是 task1
的子任务。此示例将子任务 task5
添加到任务图中,并将 task2
、task3
和 task4
指定为前置任务:
-- Create task5 and specify task2, task3, task4 as predecessors tasks.
-- The new task is a serverless task that inserts the current timestamp into a table column.
CREATE TASK task5
AFTER task2, task3, task4
AS
INSERT INTO t1(ts) VALUES(CURRENT_TIMESTAMP);
存储过程¶
创建一个名为 my_copy_task
的任务,该任务每小时调用一次存储过程,以将数据从 mytable
表卸载到名为 mystage
的暂存区(使用 COPY INTO <location>):
-- Create a stored procedure that unloads data from a table
-- The COPY statement in the stored procedure unloads data to files in a path identified by epoch time (using the Date.now() method)
CREATE OR REPLACE PROCEDURE my_unload_sp()
returns string not null
language javascript
AS
$$
var my_sql_command = ""
var my_sql_command = my_sql_command.concat("copy into @mystage","/",Date.now(),"/"," from mytable overwrite=true;");
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var result_set1 = statement1.execute();
return my_sql_command; // Statement returned for info/debug purposes
$$;
-- Create a task that calls the stored procedure every hour
CREATE TASK my_copy_task
WAREHOUSE = mywh
SCHEDULE = '60 minute'
AS
CALL my_unload_sp();
使用 SnowSQL 的多个 SQL 语句¶
创建一个执行多个 SQL 语句的任务。在以下示例中,任务修改会话的 TIMESTAMP_OUTPUT_FORMAT,然后查询 CURRENT_TIMESTAMP 函数。
备注
任务定义中的 SQL 代码包含多个语句。要执行 CREATE TASK 语句,必须临时设置分号 以外 的字符作为 SQL 语句的分隔符;否则,CREATE TASK 语句将返回用户错误。更改 SnowSQL 中 SQL 分隔符的命令是 !set sql_delimiter = <character>
。
!set sql_delimiter=/
CREATE OR REPLACE TASK test_logging
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
SCHEDULE = 'USING CRON 0 * * * * America/Los_Angeles'
AS
BEGIN
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
SELECT CURRENT_TIMESTAMP;
END;/
!set sql_delimiter=";"
使用 Snowflake Scripting 的过程逻辑¶
创建一个声明变量、使用变量且每 2 分钟返回一次变量值的任务:
CREATE TASK t1
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
SCHEDULE = '2 minute'
AS
EXECUTE IMMEDIATE
$$
DECLARE
radius_of_circle float;
area_of_circle float;
BEGIN
radius_of_circle := 3;
area_of_circle := pi() * radius_of_circle * radius_of_circle;
return area_of_circle;
END;
$$;
具有配置的根任务¶
创建一个指定配置的任务,然后读取该配置。
CREATE OR REPLACE TASK root_task_with_config
WAREHOUSE=mywarehouse
SCHEDULE='10 m'
CONFIG=$${"output_dir": "/temp/test_directory/", "learning_rate": 0.1}$$
AS
BEGIN
LET OUTPUT_DIR STRING := SYSTEM$GET_TASK_GRAPH_CONFIG('output_directory')::string;
LET LEARNING_RATE DECIMAL := SYSTEM$GET_TASK_GRAPH_CONFIG('learning_rate:v1')::DECIMAL;
...
END;
终结器任务¶
创建与任务图的根任务关联的终结器任务,该任务在任务完成后发送电子邮件警报。有关终结器任务的更多信息,请参阅 终结器任务。
CREATE TASK finalize_task
WAREHOUSE = my_warehouse
FINALIZE = my_root_task
AS
CALL SYSTEM$SEND_EMAIL(
'my_email_int',
'first.last@example.com, first2.last2@example.com',
'Email Alert: Task A has finished.',
'Task A has successfully finished.\nStart Time: 10:10:32\nEnd Time: 12:15:45\nTotal Records Processed: 115678'
);