执行 SQL 语句¶
Snowflake CLI 允许您使用 snow sql 命令执行 SQL 查询、临时查询或包含 SQL 查询的文件。
要执行临时查询,请运行类似下面的命令:
snow sql -q "SELECT * FROM FOO"
要执行包含 SQL 查询的文件,请运行类似下面的命令:
snow sql -f my_query.sql
snow sql
命令可以执行多个语句,在这种情况下,将返回多个结果集。例如,运行:
snow sql -q "select 'a', 'b'; select 'c', 'd';"
结果为以下输出:
select 'a', 'b';
+-----------+
| 'A' | 'B' |
|-----+-----|
| a | b |
+-----------+
select 'c', 'd';
+-----------+
| 'C' | 'D' |
|-----+-----|
| c | d |
+-----------+
您还可以在 Snowflake CLI 中执行 脚本块,但要注意 $$
分隔符。
例如:
EXECUTE IMMEDIATE $$
-- Snowflake Scripting code
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;
$$
;
某些操作系统会解释 $$
,例如进程 ID (PID),而不是将其识别为脚本块分隔符。为解决此限制,您可以使用以下替代方案:
如果您仍然想在命令行上指定脚本块,可以转义
$$
分隔符,如\$\$
中所示。您还可以将带有默认
$$
分隔符的脚本块放入单独的文件中,并使用snow sql -f <filename>
命令进行调用。
有关更多信息,请参阅 snow sql 命令。
为 SQL 模板使用变量¶
在某些情况下,您可能需要根据上下文更改 SQL 查询。snow sql
命令支持客户端变量替换,允许您在提交查询之前在命令中使用在本地解析的变量。 变量在 SQL 字符串中采用形式 -<% variable_name %>
, and the -D
(or --variable
) 选项指定变量的值。
备注
您当前可以使用 SnowSQL
&variable_name
和<% variable_name %>
syntax for templates. However, Snowflake recommends using the<% variable_name %>
语法。
例如,要使用客户端变量指定数据库,可以输入类似下面的命令:
snow sql -q "select * from <% database %>.logs" -D "database=dev"
执行时,该命令将替换 <% database %>
变量中的值 dev
以创建 dev.logs
文件名,然后将 select * from dev.logs
SQL 查询发送到 Snowflake 进行处理。
您还可以指定多个变量输入,如下所示:
snow sql \
-q "grant usage on database <% database %> to <% role %>" \
-D "database=dev" \
-D "role=eng_rl"
此示例生成以下 SQL 查询:
grant usage on database dev to eng_rl
在 snowflake.yml
项目定义文件中存储变量¶
将变量指定为 snow sql
命令行选项可能并不总是实用的,或者您可能不想在命令行中指定敏感值。在这种情况下,您可以在 snowflake.yml
项目定义文件中定义变量和值。然后您可以以 <% ctx.env.<variable_name> %>
形式指定变量名称,而不是使用 -D "<变量> = <value>"
选项。
使用上一部分的示例,您可以将数据库和角色变量存储在 snowflake.yml
文件中,并将查询更改为:
snow sql -q "grant usage on database <% ctx.env.database %> to <% ctx.env.role %>"
在此示例中,snow sql
命令用于在项目定义文件中查找变量定义,并提取值,而不在命令行上显示它们。snowflake.yml
文件应位于当前工作目录中,或位于使用 -p
选项指定的位置中。
有关在项目定义文件中存储这些值的更多信息,请参阅 在 SQL 中使用变量。
执行本地文件或 URLs 中的 SQL¶
您可以在 SQL 查询中使用 !source
查询命令,以执行本地文件或基于 URL 的文件中的 SQL。例如,以下命令执行名为 my_sql_code.sql
的本地文件中的所有 SQL 命令:
snow sql -q '!source my_sql_code.sql'
您还可以在 SQL 文件中嵌套 !source
命令,例如:
select emp_id FROM employees;
!source code_file_2.sql
在本示例中,该命令执行 SELECT 查询,然后执行 code_file_2.sql
文件中的 SQL 命令。在执行 !source
查询之前,Snowflake CLI 会执行以下操作:
评估变量替换和模板。
读取所有嵌套文件的内容,确保不发生递归。
当变量和模板解析完毕且未检测到递归时,命令会将代码发送到 Snowflake 以执行。
备注
如果您在 !source
查询周围使用双引号 (""
),而不是单引号 (''
),您可能需要转义 !
(\!
),具体取决于您使用的 shell。
以下示例说明了执行源文件的不同方法。
执行本地文件中的代码
本示例假定您在本地 SQL 文件中有一个简单的查询。
cat code_to_execute.sql
select 73;
要执行文件中的代码,请输入以下命令:
snow sql -q '!source code_to_execute.sql'
select 73; +----+ | 73 | |----| | 73 | +----+
执行基于 URL 的文件中的代码。
本示例假定您在 URL 的 SQL 文件中拥有相同的简单查询。
要执行文件中的代码,请输入以下命令:
snow sql -q '!source https://trusted-host/trusted-content.sql'
select 73; +----+ | 73 | |----| | 73 | +----+
执行使用变量替换和模板的代码。
本示例假定您在本地 SQL 文件中有一个使用模板变量的查询。
cat code_with_variable.sql
select '<% ctx.env.Message %>';
要执行文件中的代码,请输入定义变量值的以下命令:
snow sql -q '!source code_&value.sql;' -D value=with_variable --env Message='Welcome !'
select 'Welcome !'; +-------------+ | 'WELCOME !' | |-------------| | Welcome ! | +-------------+
备注
!source
命令支持传统 !load
别名。