Como executar instruções SQL

Snowflake CLI permite que você execute consultas SQL, consultas ad-hoc ou arquivos contendo consultas SQL, usando o comando snow sql.

Para executar uma consulta ad-hoc, execute um comando semelhante ao seguinte:

snow sql -q "SELECT * FROM FOO"
Copy

Para executar um arquivo contendo uma consulta SQL, execute um comando semelhante ao seguinte:

snow sql -f my_query.sql
Copy

O comando snow sql pode executar várias instruções, caso em que vários conjuntos de resultados são retornados. Por exemplo, ao executar:

snow sql  -q "select 'a', 'b'; select 'c', 'd';"
Copy

resulta na seguinte saída:

select 'a', 'b';
+-----------+
| 'A' | 'B' |
|-----+-----|
| a   | b   |
+-----------+

select 'c', 'd';
+-----------+
| 'C' | 'D' |
|-----+-----|
| c   | d   |
+-----------+

Você também pode executar blocos de script em Snowflake CLI com uma ressalva relacionada ao delimitador $$.

Por exemplo:

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

Alguns sistemas operacionais interpretam $$, como um ID de processo (PID), em vez de reconhecê-lo como um delimitador de bloco de script. Para resolver essa limitação, você pode usar as seguintes alternativas:

  • Se ainda quiser especificar o bloco de script na linha de comando, você pode fazer o escape dos delimitadores $$, como em \$\$.

  • Você também pode colocar o bloco de script com os delimitadores padrão $$ em um arquivo separado e chamá-lo com o comando snow sql -f <filename>.

Para obter mais informações, consulte snow sql.

Como usar ariáveis para modelos SQL

Em certas situações, você pode querer mudar suas consultas SQL baseadas no contexto. O comando snow sql oferece suporte à substituição de variável do lado do cliente, o que permite que você use variáveis no comando que são resolvidas localmente antes de enviar a consulta. As variáveis na cadeia de caracteres SQL assumem o formato <% variable_name %> e a opção -D (ou --variable) especifica o valor da variável.

Nota

Atualmente, é possível usar a sintaxe SnowSQL &variable_name e <% variable_name %> para modelos. Entretanto, a Snowflake recomenda usar a sintaxe <% variable_name %>.

Por exemplo, para especificar um banco de dados usando uma variável do lado do cliente, você pode inserir um comando semelhante ao seguinte:

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

Quando executado, o comando substitui o valor dev na variável <% database %> para criar o nome de arquivo dev.logs e envia a consulta SQL select * from dev.logs ao Snowflake para processamento.

Você também pode especificar várias entradas variáveis, conforme mostrado:

snow sql \
-q "grant usage on database <% database %> to <% role %>" \
-D "database=dev" \
-D "role=eng_rl"
Copy

Este exemplo gera a seguinte consulta SQL:

grant usage on database dev to eng_rl
Copy

Armazenamento de variáveis no arquivo de definição de projeto snowflake.yml

Especificar variáveis como opções de linha de comando snow sql pode não ser sempre prático, ou talvez você não queira especificar valores confidenciais na linha de comando. Nesses casos, você pode definir variáveis e valores no arquivo de definição de projeto snowflake.yml. Se for esse o caso, é possível simplesmente especificar os nomes da variável no formato <% ctx.env.<variable_name> %> em vez de usar a opção -D "<variável> = <valor>".

Usando o exemplo da seção anterior, você pode armazenar as variáveis de banco de dados e de função no arquivo snowflake.yml e alterar a consulta para:

snow sql -q "grant usage on database <% ctx.env.database %> to <% ctx.env.role %>"
Copy

Neste exemplo, o comando snow sql procura as definições de variável no arquivo de definição do projeto e extrai os valores sem torná-los visíveis na linha de comando. O arquivo snowflake.yml deve estar localizado no diretório de trabalho atual ou no local especificado com a opção -p.

Para obter mais informações sobre como armazenar esses valores no arquivo de definição do projeto, consulte Usos das variáveis em SQL.

Executar consultas SQL de forma assíncrona

Snowflake CLI permite que você execute uma ou mais consultas SQL de forma assíncrona. Em vez de esperar por um resultado, o comando snow sql agenda as consultas no Snowflake e retorna um ID de consulta. Após a conclusão de uma consulta, você pode obter o resultado usando o comando de consulta !result ou o comando SQL RESULT_SCAN.

Para executar uma consulta SQL de forma assíncrona, encerre a consulta com ;> em vez de ;, conforme mostrado:

snow sql -q 'select "My async query" ;>'
Copy

O exemplo a seguir executa uma única consulta de forma assíncrona:

snow sql -q "select 'This is async query';>"
Copy
select 'This is async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3011-080f-f2d7-0001-c1be14bae7c2 |
+--------------------------------------+

Em seguida, você pode usar o ID de consulta retornado no comando de consulta !result para exibir o resultado da consulta:

snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
path-to-private-key-file
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query   |
+-----------------------+

Você também pode executar várias consultas na cadeia de caracteres de consulta, tanto de forma assíncrona quanto síncrona, conforme mostrado:

snow sql -q "select 'This is async query';> select 'Not an async query'; select 'Another async query';>"
Copy
select 'This is async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3b8c-0109-2e81-0000-0f2d0e5a4a32 |
+--------------------------------------+

select 'Not an async query';
+----------------------+
| 'NOT AN ASYNC QUERY' |
|----------------------|
| Not an async query   |
+----------------------+

select 'Another async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3b8c-0109-2e81-0000-0f2d0e5a4a36 |
+--------------------------------------+

Trabalhar com os comandos de consulta SQL

Snowflake CLI fornece os seguintes comandos que você pode usar em suas consultas SQL:

  • !source, que executa SQL em arquivos locais ou URLs.

  • !queries, que lista todas as consultas SQL.

  • !result, que exibe o resultado de uma consulta SQL.

  • !abort, que aborta uma consulta SQL ativa.

Dica

Se você colocar a consulta SQL entre aspas duplas ("") em vez de aspas simples (''), talvez seja necessário fazer escape do ponto de exclamação (!), dependendo do shell utilizado.

Executar SQL em arquivos locais ou URLs

Você pode usar o comando de consulta !source em sua consulta SQL para executar SQL em arquivos locais ou em um arquivo baseado em URL. Por exemplo, o comando a seguir executa todos os comandos SQL em um arquivo local chamado my_sql_code.sql:

snow sql -q '!source my_sql_code.sql'
Copy

Você também pode aninhar comandos !source nos arquivos SQL, como:

select emp_id FROM employees;
!source code_file_2.sql
Copy

Neste exemplo, o comando executa a consulta SELECT e, em seguida, executa os comandos SQL no arquivo code_file_2.sql. Antes de executar as consultas !source, Snowflake CLI faz o seguinte:

  • Avalia substituições de variáveis e modelos.

  • Lê o conteúdo de todos os arquivos aninhados para garantir que não ocorra recursão.

Quando as variáveis e os modelos são resolvidos e nenhuma recursão é detectada, o comando envia o código para o Snowflake para execução.

Nota

Se você usar aspas duplas ("") em vez de aspas simples ('') em torno de uma consulta !source, talvez seja necessário fazer o escape do ! (\!) dependendo do shell que você usa.

Os exemplos a seguir ilustram diferentes maneiras de executar arquivos de origem.

  • Execute o código em um arquivo local.

    Este exemplo pressupõe que você tenha uma consulta simples em um arquivo local SQL.

    cat code_to_execute.sql
    
    Copy
    select 73;
    

    Para executar o código no arquivo, digite o seguinte comando:

    snow sql -q '!source code_to_execute.sql'
    
    Copy
    select 73;
    +----+
    | 73 |
    |----|
    | 73 |
    +----+
    
  • Execute o código em um arquivo baseado em URL.

    Este exemplo pressupõe que você tenha a mesma consulta simples em um arquivo SQL em um URL.

    Para executar o código no arquivo, digite o seguinte comando:

    snow sql -q '!source https://trusted-host/trusted-content.sql'
    
    Copy
    select 73;
    +----+
    | 73 |
    |----|
    | 73 |
    +----+
    
  • Execute o código que usa substituição de variáveis e modelos.

    Este exemplo pressupõe que você tenha uma consulta em um arquivo local SQL que usa uma variável de modelo.

    cat code_with_variable.sql
    
    Copy
    select '<% ctx.env.Message %>';
    

    Para executar o código no arquivo, digite o seguinte comando que define o valor da variável:

    snow sql -q '!source code_&value.sql;' -D value=with_variable --env Message='Welcome !'
    
    Copy
    select 'Welcome !';
    +-------------+
    | 'WELCOME !' |
    |-------------|
    | Welcome !   |
    +-------------+
    

Nota

O comando !source é compatível com o alias legado !load.

Listar todas as consultas SQL

O comando de consulta !queries lista todas as consultas de uma conta. Por padrão, o comando lista as 25 consultas mais recentes executadas na sessão atual.

Por exemplo, o seguinte comando de consulta !queries retorna as três consultas mais recentes de um usuário específico:

snow sql -q '!queries user=user1 amount=3'
Copy
+-------------------------------------------------------------------------------------------------------------------------------------+
| QUERY ID                             | SQL TEXT                                                           | STATUS    | DURATION_MS |
|--------------------------------------+--------------------------------------------------------------------+-----------+-------------|
| 01bc3040-080f-f4f9-0001-c1be14bb603a | select current_version();                                          | SUCCEEDED | 3858        |
| 01bc303d-080f-f4e9-0001-c1be14bb1812 | SELECT SYSTEM$CANCEL_QUERY('01bc3011-080f-f2d7-0001-c1be14bae7c2') | SUCCEEDED | 564         |
| 01bc3011-080f-f2d7-0001-c1be14bae7c2 | select 'This is async query'                                       | SUCCEEDED | 931         |
+-------------------------------------------------------------------------------------------------------------------------------------+

Você pode usar os seguintes filtros para restringir a lista de consultas retornadas:

Filter

Padrão

Descrição

valor (inteiro)

25

Número de consultas recentes a serem retornadas (padrão: 25).

session (booliano)

N/A

Se fornecido, retorna apenas as consultas executadas na sessão atual.

warehouse (string)

Nenhum

Retorna as consultas executadas somente no warehouse especificado.

user (string)

Nenhum

Retorna as consultas executadas somente pelo usuário especificado.

duration (milissegundos)

0

Retorna apenas as consultas que levaram pelo menos o número especificado de milissegundos.

start_date (string)

Nenhum

Retorna apenas as consultas executadas após a data especificada. Espera-se que a data seja fornecida no formato ISO (por exemplo: 2025-01-01T09:00:00)

end_date (string)

Nenhum

Retorna apenas as consultas executadas antes da data especificada. Espera-se que a data seja fornecida no formato ISO (por exemplo: 2025-01-01T09:00:00)

start (inteiro)

Nenhum

Retorna apenas as consultas executadas após o carimbo de data/hora Unix especificado (em milissegundos).

end (inteiro)

Nenhum

Retorna apenas as consultas executadas antes do carimbo de data/hora Unix especificado (em milissegundos).

status (enum)

Nenhum

Retorna apenas consultas em um dos seguintes status:

  • RUNNING

  • SUCCEEDED

  • FAILED

  • BLOCKED

  • QUEUED

  • ABORTED

type

Nenhum

Retorna apenas consultas de um dos seguintes tipos:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

  • MULTI_TABLE_INSERT

  • COPY

  • COMMIT

  • ROLLBACK

  • BEGIN_TRANSACTION

  • SHOW

  • GRANT

  • CREATE

  • ALTER

Os exemplos a seguir retornam consultas usando diferentes filtros:

  • Retorna as 25 consultas mais recentes executadas na sessão atual:

    snow sql -q 'select 42; select 15; !queries session'
    
    Copy
  • Retorna as 20 consultas mais recentes executadas na conta:

    snow sql -q '!queries amount=20'
    
    Copy
  • Retorna as 20 consultas mais recentes executadas na conta que levaram mais de 200 milissegundos para serem executadas:

    snow sql -q '!queries amount=20 duration=200'
    
    Copy
  • Retorna as 25 consultas mais recentes executadas no warehouse especificado:

    snow sql -q '!queries warehouse=mywh'
    
    Copy

Retornar um resultado de consulta SQL concluído

O comando de consulta !result retorna o resultado de uma consulta concluída, considerando o ID de consulta. Você pode obter o ID de consulta das seguintes maneiras:

snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query   |
+-----------------------+

Abortar uma consulta SQL ativa

O comando de consulta !abort aborta uma consulta ativa, considerando o ID de consulta. Você pode obter o ID de consulta das seguintes maneiras:

snow sql -q '!abort 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
+-------------------------------------------------------------+
| SYSTEM$CANCEL_QUERY('01BC3011-080F-F2D7-0001-C1BE14BAE7C2') |
|-------------------------------------------------------------|
| Identified SQL statement is not currently executing.        |
+-------------------------------------------------------------+

Inserção de vários comandos em uma única transação

A opção --single-transaction permite que você insira vários comandos SQL para serem executados como um conjunto de comandos do tipo “tudo ou nada”. Ao executar comandos em uma única transação, você pode garantir que todos os comandos sejam concluídos com sucesso antes de confirmar qualquer alteração. Se algum dos comandos falhar, nenhuma das alterações dos comandos bem-sucedidos persistirá.

Os exemplos a seguir mostram transações bem e malsucedidas:

  • Execução bem-sucedida do comando

    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. |
    +----------------------------------+
    

    Você pode então verificar se os comandos foram confirmados no banco de dados:

    snow sql -q "select count(*) from my_tbl"
    
    Copy
    select count(*) from my_tbl
    +----------+
    | COUNT(*) |
    |----------|
    | 2        |
    +----------+
    
  • Transação única malsucedida

    snow sql -c patcli -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'                                                              │
    ╰───────────────────────────────────────────────────────────────────────────────────────╯
    

Você pode então verificar se os comandos não foram confirmados no banco de dados:

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

Inserção de comandos SQL no modo interativo

O comando snow sql é compatível com um modo interativo que permite que você insira os comandos SQL um de cada vez. O modo interativo oferece os seguintes recursos:

  • Realce de sintaxe

    Realce de sintaxe no modo interativo
  • Conclusão de código durante a digitação

    Conclusão do código no modo interativo
  • Histórico pesquisável

    Pressionar CTRL-R: permite que você pesquise o histórico de comandos:

    Histórico pesquisável no modo interativo
  • Entrada de várias linhas

    Pressionar ENTER em uma linha que não termina com ponto e vírgula (;) move o cursor para a próxima linha para mais comandos até que uma instrução termine com ponto e vírgula.

    Entrada de várias linhas no modo interativo

Para usar o modo interativo, insira o comando snow sql seguido de ENTER, conforme mostrado:

snow sql
Copy

O comando abre um sub-shell com um prompt > onde você pode inserir comandos SQL de forma interativa:

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

Você pode então inserir os comandos SQL, conforme mostrado:

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

Nota

Você deve terminar cada instrução SQL com um ponto e vírgula (;).

Para sair do modo interativo, insira exit, quit ou CTRL-D.