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"
Para executar um arquivo contendo uma consulta SQL, execute um comando semelhante ao seguinte:
snow sql -f my_query.sql
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';"
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;
$$
;
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 comandosnow 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"
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"
Este exemplo gera a seguinte consulta SQL:
grant usage on database dev to eng_rl
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 %>"
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" ;>'
O exemplo a seguir executa uma única consulta de forma assíncrona:
snow sql -q "select 'This is async query';>"
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'
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';>"
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'
Você também pode aninhar comandos !source
nos arquivos SQL, como:
select emp_id FROM employees;
!source code_file_2.sql
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
select 73;
Para executar o código no arquivo, digite o seguinte comando:
snow sql -q '!source code_to_execute.sql'
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'
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
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 !'
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'+-------------------------------------------------------------------------------------------------------------------------------------+ | 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: |
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: |
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:
|
type |
Nenhum |
Retorna apenas consultas de um dos seguintes tipos:
|
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'
Retorna as 20 consultas mais recentes executadas na conta:
snow sql -q '!queries amount=20'
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'
Retorna as 25 consultas mais recentes executadas no warehouse especificado:
snow sql -q '!queries warehouse=mywh'
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:
Consulte a página Histórico de consultas no Snowsight.
Execute o comando de consulta SQL
!queries
.Use o ID retornado por uma consulta assíncrona.
snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
+-----------------------+
| '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:
Consulte a página Histórico de consultas no Snowsight.
Execute o comando de consulta SQL
!queries
.Use o ID retornado por uma consulta assíncrona.
snow sql -q '!abort 01bc3011-080f-f2d7-0001-c1be14bae7c2'
+-------------------------------------------------------------+
| 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
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"
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
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"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
Conclusão de código durante a digitação
Histórico pesquisável
Pressionar CTRL-R: permite que você pesquise o histórico de comandos:
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.
Para usar o modo interativo, insira o comando snow sql
seguido de ENTER, conforme mostrado:
snow sql
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);
+-------------------------------------+
| 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.