snow sql

执行 Snowflake 查询。 使用查询、文件名或输入选项。 可以使用查询选项、文件名选项(将执行文件中的所有查询)或使用其他命令的管道输出,通过 stdin 指定要执行的查询。例如 cat my.sql | snow sql -i。 该命令支持在客户端发生的变量替换。

语法

snow sql
  --query <query>
  --filename <files>
  --stdin
  --variable <data_override>
  --retain-comments
  --single-transaction / --no-single-transaction
  --project <project_definition>
  --env <env_overrides>
  --connection <connection>
  --host <host>
  --port <port>
  --account <account>
  --user <user>
  --password <password>
  --authenticator <authenticator>
  --private-key-file <private_key_file>
  --token-file-path <token_file_path>
  --database <database>
  --schema <schema>
  --role <role>
  --warehouse <warehouse>
  --temporary-connection
  --mfa-passcode <mfa_passcode>
  --enable-diag
  --diag-log-path <diag_log_path>
  --diag-allowlist-path <diag_allowlist_path>
  --oauth-client-id <oauth_client_id>
  --oauth-client-secret <oauth_client_secret>
  --oauth-authorization-url <oauth_authorization_url>
  --oauth-token-request-url <oauth_token_request_url>
  --oauth-redirect-uri <oauth_redirect_uri>
  --oauth-scope <oauth_scope>
  --oauth-disable-pkce
  --oauth-enable-refresh-tokens
  --oauth-enable-single-use-refresh-tokens
  --client-store-temporary-credential
  --format <format>
  --verbose
  --debug
  --silent
  --enhanced-exit-codes
Copy

实参

选项

--query, -q TEXT

要执行的查询。

--filename, -f FILE

要执行的文件。默认值:[]。

--stdin, -i

从标准输入读取查询。在管道输入此命令时使用它。默认值:False。

--variable, -D TEXT

key=value 格式的字符串。如果提供,SQL 内容将被视为模板并使用所提供的数据渲染。

--retain-comments

保留传递给 Snowflake 的查询中的注释。默认值:False。

--single-transaction / --no-single-transaction

连接时禁用自动提交。将语句放入 BEGIN/COMMIT 内可将语句作为单个事务执行,并确保所有命令成功完成或不应用更改。默认值:False。

-p, --project TEXT

Snowflake 项目的存储路径。默认为当前工作目录。

--env TEXT

格式为 key=value 的字符串。替换用于模板的 env 部分的变量。默认值:[]。

--connection, -c, --environment TEXT

连接名称,如您在 config.toml 文件中所定义。默认值:default

--host TEXT

连接的主机地址。替换为连接指定的值。

--port INTEGER

连接的端口。替换为连接指定的值。

--account, --accountname TEXT

分配给 Snowflake 账户的名称。替换为连接指定的值。

--user, --username TEXT

连接到 Snowflake 的用户名。替换为连接指定的值。

--password TEXT

Snowflake 密码。替换为连接指定的值。

--authenticator TEXT

Snowflake 身份验证器。替换为连接指定的值。

--private-key-file, --private-key-path TEXT

Snowflake 私钥文件路径。替换为连接指定的值。

--token-file-path TEXT

连接到 Snowflake 时使用的带有 OAuth 令牌的文件路径。

--database, --dbname TEXT

要使用的数据库。替换为连接指定的值。

--schema, --schemaname TEXT

要使用的数据库架构。替换为连接指定的值。

--role, --rolename TEXT

要使用的角色。替换为连接指定的值。

--warehouse TEXT

要使用的仓库。替换为连接指定的值。

--temporary-connection, -x

使用命令行参数定义的连接,而不是在配置中定义的连接。默认值:False。

--mfa-passcode TEXT

用于多重身份验证的令牌 (MFA)。

--enable-diag

是否生成连接诊断报告。默认值:False。

--diag-log-path TEXT

生成的报告的路径。默认为系统临时目录。默认:<system_temporary_directory>。

--diag-allowlist-path TEXT

包含允许列表参数的 JSON 文件的路径。

--oauth-client-id TEXT

身份提供商为 Snowflake 集成提供的客户端 ID 的值。

--oauth-client-secret TEXT

身份提供商为 Snowflake 集成提供的客户端密钥的值。

--oauth-authorization-url TEXT

向驱动程序提供授权码的身份提供商端点。

--oauth-token-request-url TEXT

向驱动程序提供访问令牌的身份提供商端点。

--oauth-redirect-uri TEXT

URI 用于授权码重定向。

--oauth-scope TEXT

身份提供商授权请求中请求的范围。

--oauth-disable-pkce

禁用代码交换证明密钥 (PKCE)。默认值:False

--oauth-enable-refresh-tokens

在实际访问令牌过期时启用静默重新身份验证。默认值:False

--oauth-enable-single-use-refresh-tokens

是否选择启用一次性刷新令牌语义。默认值:False

--client-store-temporary-credential

存储临时凭据。

--format [TABLE|JSON]

指定输出格式。默认:TABLE。

--verbose, -v

显示日志级别 info 及更高级别的日志条目。默认值:False。

--debug

显示日志级别 debug 及更高级别的日志条目;调试日志包含其他信息。默认值:False。

--silent

关闭到控制台的中间输出。默认值:False。

--enhanced-exit-codes

根据错误类型区分退出错误代码。默认值:False。

--help

显示此命令的帮助文本。

使用说明

您可以使用以下选项之一指定要执行的 SQL 查询

  • 使用 --query 选项指定查询字符串。

  • 使用 --filename 选项执行一个或多个包含 SQL 查询的文件。例如:

    • snow sql -f myfile.sql

    • snow sql -f file1.sql -f file2.sql

  • 将查询指定为 stdin,并通过管道将其传送到 snow sql 命令,如 cat my.sql | snow sql

  • 如果您的查询包含不希望 shell 解释的特殊字符,例如 SYSTEM 函数 中的美元符号,则可以执行以下任一操作:

    • 将查询放到单引号而不是双引号里,如:

      snow sql -q 'SELECT SYSTEM$CLIENT_VERSION_INFO()'

    • 转义特殊字符,如:

      snow sql -q "SELECT SYSTEM\$CLIENT_VERSION_INFO()"

  • 使用和 <% variable_name %> placeholder in your SQL queries and a -D 命令行选项组合的变量来模板化 SQL 查询,格式为:

    snow sql -q "select * from my-database order by <% column_name %>" -D "column_name=Country"
    
    Copy

    备注

    您目前可以为模板使用 SnowSQL &variable_name<% variable_name %> 语法。但是,Snowflake 建议使用 <% variable_name %> 语法。

  • 在查询中指定脚本块。例如:

    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;
    $$
    ;
    
    Copy

    备注

    在 Snowflake CLI 命令行上直接指定脚本块时,$$ 分隔符可能在某些 shell 中无法正常运行,因为它们会将该分隔符解释为其他内容。例如,bash 和 zsh shell 会将其解释为过程 ID (PID)。为解决此限制,您可以使用以下替代方案:

    • 如果您仍然想在命令行上指定脚本块,可以转义 $$ 分隔符,如 \$\$ 中所示。

    • 您还可以将带有默认 $$ 分隔符的脚本块放入单独的文件中,并使用 snow sql -f <filename> 命令进行调用。

增强的错误代码

--enhanced-exit-codes 选项提供的信息有助于识别问题是由查询执行还是由无效的命令选项引起的。使用此选项,snow sql 命令提供以下返回代码:

  • 0:执行成功

  • 2:命令参数问题

  • 5:查询执行问题

  • 1:其他类型的问题

命令执行后,您可以使用:codenowrap:echo $? shell 命令来查看返回代码。

在此示例中,该命令同时包含查询参数 (-q 'select 1') 和查询文件参数 (-f my.query),后者是无效的参数组合:

snow sql --enhanced-exit-codes -q 'select 1' -f my.query

echo $?
Copy
2

以下示例显示了当命令包含无效查询(选择拼写错误)时 --enhanced-exit-codes 选项的效果:

  • 在使用 --enhanced-exit-codes 选项的情况下,该命令会返回 5 退出代码以表示查询错误:

    snow sql --enhanced-exit-codes -q 'slect 1'
    
    echo $?
    
    Copy
    5
    
  • 在不使用:codenowrap: --enhanced-exit-codes ` 选项的情况下,该命令会返回 :codenowrap:`1 退出代码以表示出现通用(其他)错误:

    snow sql --enhanced-exit-codes -q 'slect 1'
    
    echo $?
    
    Copy
    1
    

或者,您可以将 SNOWFLAKE_ENHANCED_EXIT_CODES 环境变量设置为 1 以发送所有 snow sql 命令的增强返回码。

交互模式

snow sql 命令支持交互模式,允许您一次输入一个 SQL 命令。交互模式提供以下功能:

  • 语法突出显示

    交互模式语法突出显示
  • 输入时代码补全

    交互模式代码补全
  • 可搜索的历史记录

    要搜索命令历史记录,请按 CTRL-R

    交互模式可搜索的历史记录
  • 多行输入

    如果按下 ENTER 键时,当前行末尾没有分号 (;),光标会移动到下一行,等待输入更多命令,直到语句以分号结束为止。

    交互模式多行输入

要使用交互模式,请输入 snow sql 命令,然后输入 ENTER,如下所示:

snow sql
Copy

该命令会打开一个带有 > 提示符的子 shell,您可以在其中交互式地输入 SQL 命令:

$ snow sql
  ╭───────────────────────────────────────────────────────────────────────────────────╮
  │ Welcome to Snowflake-CLI REPL                                                   │
  │ Type 'exit' or 'quit' to leave                                                  │
  ╰───────────────────────────────────────────────────────────────────────────────────╯
  >

然后,您可以输入 SQL 命令,如下所示:

> create table my_table (c1 int);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MY_TABLE successfully created.|
+-------------------------------------+

备注

每条 SQL 语句必须以分号 (;) 结尾。

要退出交互模式,请输入 exitquitCTRL-D

在单个事务中使用多个命令

--single-transaction 选项允许您输入多个 SQL 命令,并将它们作为一个“要么全部执行,要么全部回滚”的命令集合来执行。将命令作为一个事务执行,可以确保所有命令都成功完成后才提交更改。如果其中任何一个命令失败,之前已成功命令所做的更改也不会被保留。

以下示例展示了事务执行成功和失败的情况:

  • 命令执行成功

    snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124);" --single-transaction
    
    Copy
    BEGIN;
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    
    insert into my_tbl values (123);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    insert into my_tbl values (124);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    COMMIT
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    

    然后,您可以验证命令是否已提交到数据库中:

    snow sql -q "select count(*) from my_tbl"
    
    Copy
    select count(*) from my_tbl
    +----------+
    | COUNT(*) |
    |----------|
    | 2        |
    +----------+
    
  • 单个事务失败

    snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124); select BAD;" --single-transaction
    
    Copy
    BEGIN;
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    
    insert into my_tbl values (123);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    insert into my_tbl values (124);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    select BAD;
    ╭─ Error ───────────────────────────────────────────────────────────────────────────────╮
    │ 000904 (42000): 01bc3b84-0810-0247-0001-c1be14ee11ce: SQL compilation error: error    │
    │ line 1 at position 7                                                                  │
    │ invalid identifier 'BAD'                                                              │
    ╰───────────────────────────────────────────────────────────────────────────────────────╯
    

然后,您可以验证命令是否未提交到数据库中:

snow sql -q "select count(*) from my_tbl"
Copy
select count(*) from my_tbl
+----------+
| COUNT(*) |
|----------|
| 0        |
+----------+

示例

  • 以下示例使用 SQL SYSTEM$CLIENT_VERSION_INFO 系统函数返回有关客户端和驱动程序的版本信息。

    snow sql --query 'SELECT SYSTEM$CLIENT_VERSION_INFO();'
    
    Copy
    select current_version();
    +-------------------+
    | CURRENT_VERSION() |
    |-------------------|
    | 8.25.1            |
    +-------------------+
    
  • 下面的示例展示了如何使用客户端变量指定数据库:

    snow sql -q "select * from <% database %>.logs" -D "database=dev"
    
    Copy

    执行时,该命令将替换 <% database %> 变量中的值 dev 以创建 dev.logs 标识符,然后将 select * from dev.logs SQL 查询发送到 Snowflake 进行处理。

    备注

    您当前可以使用 SnowSQL &variable_name 和 &``{ variable_name }`` 语法作为模板。但是 Snowflake 建议使用 <% variable_name %> 语法。

  • 此示例展示了如何使用 --env 选项传递环境变量:

    snow sql -q "select '<% ctx.env.test %>'" --env test=value_from_cli
    
    Copy
  • 默认情况下,Snowflake CLI 会从输出中移除 SQL 查询中的注释。下面的示例使用 --retain-comments 选项将注释包含在查询结果中。

    假设 example.sql 文件包含以下语句和注释:

    select 'column1';
    -- My comment
    select 'column2';
    
    Copy

    执行以下命令时,-- My comment 会出现在查询结果中。

    snow sql -f example.sql --retain-comments
    
    Copy
    select 'column1';
    +-----------+
    | 'COLUMN1' |
    |-----------|
    | ABC       |
    +-----------+
    
    -- My comment
    select 'bar';
    +-----------+
    | 'COLUMN2' |
    |-----------|
    | 123       |
    +-----------+
    
    Copy
语言: 中文