snow sql

Exécute la requête Snowflake. Utilisez soit une requête, un nom de fichier ou une option d’entrée. La requête à exécuter peut être spécifiée à l’aide de l’option query, de l’option filename (toutes les requêtes du fichier seront exécutées) ou via stdin en acheminant la sortie d’une autre commande. Par exemple, cat my.sql | snow sql -i. La commande prend en charge la substitution de variables côté client.

Syntaxe

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

Arguments

Aucun(e)

Options

--query, -q TEXT

Requête à exécuter.

--filename, -f FILE

Fichier à exécuter. Par défaut : [].

--stdin, -i

Lisez la requête à partir de l’entrée standard. Utilisez-le lorsque vous introduisez des données dans cette commande. Par défaut : false.

--variable, -D TEXT

Chaîne au format clé=valeur. Si elle est fournie, le contenu SQL sera traité comme un modèle et rendu à l’aide des données fournies.

--retain-comments

Conserve les commentaires dans les requêtes transmises à Snowflake. Par défaut : false.

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

Se connecte asans validation automatique. Ajoute BEGIN/COMMIT autour des instructions pour les exécuter en tant que transaction unique, en s’assurant que toutes les commandes se terminent avec succès ou qu’aucun changement n’est appliqué. Par défaut : false.

-p, --project TEXT

Chemin où le projet Snowflake est stocké. La valeur par défaut est le répertoire de travail actuel.

--env TEXT

Chaîne au format clé=valeur. Remplace les variables de la section env utilisées pour les modèles. Par défaut : [].

--connection, -c, --environment TEXT

Nom de la connexion, tel que défini dans votre fichier config.toml. Défaut : défaut.

--host TEXT

Adresse de l’hôte pour la connexion. Remplace la valeur spécifiée pour la connexion.

--port INTEGER

Port pour la connexion. Remplace la valeur spécifiée pour la connexion.

--account, --accountname TEXT

Nom attribué à votre compte Snowflake. Remplace la valeur spécifiée pour la connexion.

--user, --username TEXT

Nom d’utilisateur pour se connecter à Snowflake. Remplace la valeur spécifiée pour la connexion.

--password TEXT

Mot de passe Snowflake. Remplace la valeur spécifiée pour la connexion.

--authenticator TEXT

Authentificateur Snowflake. Remplace la valeur spécifiée pour la connexion.

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

Chemin du fichier de clé privée Snowflake. Remplace la valeur spécifiée pour la connexion.

--token-file-path TEXT

Chemin d’accès au fichier contenant un jeton OAuth à utiliser lors de la connexion à Snowflake.

--database, --dbname TEXT

Base de données à utiliser. Remplace la valeur spécifiée pour la connexion.

--schema, --schemaname TEXT

Schéma de la base de données à utiliser. Remplace la valeur spécifiée pour la connexion.

--role, --rolename TEXT

Rôle à utiliser. Remplace la valeur spécifiée pour la connexion.

--warehouse TEXT

Entrepôt à utiliser. Remplace la valeur spécifiée pour la connexion.

--temporary-connection, -x

Utilise une connexion définie avec les paramètres de la ligne de commande, au lieu d’une connexion définie dans la configuration. Par défaut : false.

--mfa-passcode TEXT

Jeton à utiliser pour l’authentification multifactorielle (MFA)

--enable-diag

Indique s’il faut générer un rapport de diagnostic de la connexion. Par défaut : false.

--diag-log-path TEXT

Chemin d’accès au rapport généré. Il s’agit du répertoire temporaire du système par défaut. Par défaut : <system_temporary_directory>.

--diag-allowlist-path TEXT

Chemin d’accès à un fichier JSON contenant les paramètres de la liste d’autorisations.

--oauth-client-id TEXT

Valeur de l’identifiant du client fourni par le fournisseur d’identité pour l’intégration dans Snowflake.

--oauth-client-secret TEXT

Valeur du secret du client fourni par le fournisseur d’identité pour l’intégration dans Snowflake.

--oauth-authorization-url TEXT

Point de terminaison du fournisseur d’identité fournissant le code d’autorisation au pilote.

--oauth-token-request-url TEXT

Point de terminaison du fournisseur d’identité fournissant les jetons d’accès au pilote.

--oauth-redirect-uri TEXT

URI à utiliser pour la redirection du code d’autorisation.

--oauth-scope TEXT

Champ d’application demandé dans la requête d’autorisation du fournisseur d’identité.

--oauth-disable-pkce

Désactive la clé de preuve pour l’échange de code (PKCE). Par défaut : False.

--oauth-enable-refresh-tokens

Permet une réauthentification silencieuse lorsque le jeton d’accès actuel n’est plus valable. Par défaut : False.

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

Indique s’il faut choisir une sémantique de jeton d’actualisation à usage unique. Par défaut : False.

--client-store-temporary-credential

Enregistrez les identifiants de connexion temporaires.

--format [TABLE|JSON]

Spécifie le format de sortie. Par défaut : TABLE.

--verbose, -v

Affiche les entrées de journal pour les niveaux de journalisation info et supérieurs. Par défaut : false.

--debug

Affiche les entrées de journal pour les niveaux de journalisation debug et supérieurs ; les journaux de débogage contiennent des informations supplémentaires. Par défaut : false.

--silent

Désactive la sortie intermédiaire vers la console. Par défaut : false.

--enhanced-exit-codes

Différenciez les codes d’erreur de sortie en fonction du type d’erreur. Par défaut : false.

--help

Affiche le texte d’aide de cette commande.

Notes sur l’utilisation

Vous pouvez spécifier la requête SQL à exécuter en utilisant l’une des options suivantes

  • Spécifiez la chaîne de requête à l’aide de l’option --query.

  • Utilisez l’option --filename pour exécuter un ou plusieurs fichiers contenant une ou plusieurs requêtes SQL. Par exemple :

    • snow sql -f myfile.sql

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

  • Spécifiez la requête comme stdin et envoyez-la à la commande snow sql, telle que cat my.sql | snow sql.

  • Si votre requête contient des caractères spéciaux, tels que le signe du dollar dans les fonctions SYSTEM, que vous ne voulez pas que l’interpréteur de commandes interprète, vous pouvez procéder de l’une ou l’autre des manières suivantes :

    • Mettez la requête entre guillemets simples au lieu de guillemets doubles, comme dans l’exemple suivant :

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

    • Échappez le caractère spécial, comme dans :

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

  • Utilisez les variables pour modeler les requêtes SQL avec une combinaison d’un espace réservé <% variable_name %> dans vos requêtes SQL et d’une option de ligne de commande -D, sous la forme suivante :

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

    Note

    Vous pouvez actuellement utiliser la syntaxe SnowSQL &variable_name et <% variable_name %> pour les modèles. Cependant, Snowflake recommande d’utiliser la syntaxe <% variable_name %>.

  • Spécifiez un bloc Exécution de scripts dans les requêtes. Par exemple :

    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

    Note

    Lorsque vous spécifiez le bloc Scripting directement sur la ligne de commande Snowflake CLI, les délimiteurs $$ peuvent ne pas fonctionner pour certains shells car ils interprètent ce délimiteur comme quelque chose d’autre. Par exemple, les shells bash et zsh l’interprètent comme l’ID de processus (PID). Pour remédier à cette limite, vous pouvez utiliser les alternatives suivantes :

    • Si vous souhaitez toujours spécifier le bloc d’exécution de scripts sur la ligne de commande, vous pouvez isoler les délimiteurs $$, comme dans \$\$.

    • Vous pouvez également placer le bloc d’exécution de scripts avec les délimiteurs par défaut $$ dans un fichier séparé et l’appeler avec la commande snow sql -f <filename>.

Codes d’erreur améliorés

L’option --enhanced-exit-codes fournit des informations qui permettent d’identifier si les problèmes résultent de l’exécution de la requête ou d’options de commande non valides. Avec cette option, la commande snow sql fournit les codes de retour suivants :

  • 0 : Exécution réussie

  • 2 : Problèmes liés aux paramètres de commande

  • 5 : Problèmes d’exécution des requêtes

  • 1 : Autres types de problèmes

Après l’exécution de la commande, vous pouvez utiliser la commande shell echo $? pour voir le code de retour.

Dans cet exemple, la commande contient à la fois un paramètre de requête (-q 'select 1') et un paramètre de fichier de requête (-f my.query), ce qui constitue une combinaison de paramètres non valide :

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

echo $?
Copy
2

Les exemples suivants montrent l’effet de l’option --enhanced-exit-codes lorsque la commande contient une requête non valide (slect est mal orthographié) :

  • Avec l’option --enhanced-exit-codes, la commande renvoie un code de sortie 5 pour indiquer une erreur de requête :

    snow sql --enhanced-exit-codes -q 'slect 1'
    
    echo $?
    
    Copy
    5
    
  • Sans l’option --enhanced-exit-codes, la commande renvoie un code de sortie 1 pour indiquer une erreur générique (autre) :

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

Vous pouvez également définir la variable d’environnement SNOWFLAKE_ENHANCED_EXIT_CODES sur 1 pour envoyer les codes de retour améliorés pour toutes les commandes snow sql.

Mode interactif

La commande snow sql prend en charge un mode interactif qui vous permet de saisir des commandes SQL une par une. Le mode interactif offre les fonctions suivantes :

  • Mise en évidence de la syntaxe

    Mise en évidence de la syntaxe en mode interactif
  • Complétion du code lors de la frappe

    Complétion du code en mode interactif
  • Historique consultable

    Pour effectuer une recherche dans l’historique de vos commandes, appuyez sur CTRL-R :

    Historique consultable en mode interactif
  • Entrée multilignes

    En appuyant sur ENTER sur une ligne qui ne se termine pas par un point-virgule (;), le curseur passe à la ligne suivante pour d’autres commandes jusqu’à ce qu’une instruction se termine par un point-virgule.

    Entrée multilignes en mode interactif

Pour utiliser le mode interactif, entrez la commande snow sql, suivie de ENTER, comme indiqué :

snow sql
Copy

La commande ouvre un sous-interpréteur avec une invite > où vous pouvez entrer des commandes SQL de manière interactive :

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

Vous pouvez ensuite entrer les commandes SQL, comme indiqué :

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

Note

Vous devez terminer chaque instruction SQL par un point-virgule (;).

Pour quitter le mode interactif, entrez exit, quit, ou CTRL-D.

Plusieurs commandes dans une même transaction

L’option --single-transaction vous permet de saisir plusieurs commandes SQL à exécuter comme un ensemble de commandes « tout ou rien ». En exécutant les commandes dans une seule transaction, vous pouvez vous assurer que toutes les commandes ont été exécutées avec succès avant de valider les modifications. Si l’une des commandes échoue, aucune des modifications apportées par les commandes abouties n’est maintenue.

Les exemples suivants montrent des transactions abouties et non abouties :

  • Exécution de commande aboutie

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

    Vous pouvez alors vérifier que les commandes ont été validées dans la base de données :

    snow sql -q "select count(*) from my_tbl"
    
    Copy
    select count(*) from my_tbl
    +----------+
    | COUNT(*) |
    |----------|
    | 2        |
    +----------+
    
  • Transaction unique infructueuse

    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'                                                              │
    ╰───────────────────────────────────────────────────────────────────────────────────────╯
    

Vous pouvez alors vérifier que les commandes n’ont pas été validées dans la base de données :

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

Exemples

  • L’exemple suivant utilise la fonction système SQL SYSTEM$CLIENT_VERSION_INFO pour renvoyer des informations sur la version des clients et des pilotes.

    snow sql --query 'SELECT SYSTEM$CLIENT_VERSION_INFO();'
    
    Copy
    select current_version();
    +-------------------+
    | CURRENT_VERSION() |
    |-------------------|
    | 8.25.1            |
    +-------------------+
    
  • L’exemple suivant montre comment vous pouvez spécifier une base de données à l’aide d’une variable côté client :

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

    Lorsqu’elle est exécutée, la commande remplace la valeur dev dans la variable <% database %> pour créer l’identificateur dev.logs, puis envoie la requête select * from dev.logs SQL à Snowflake en vue de son traitement.

    Note

    Vous pouvez actuellement utiliser la syntaxe SnowSQL &variable_name and & { variable_name } pour les modèles. Cependant, Snowflake recommande d’utiliser la <% variable_name %>.

  • Cet exemple montre comment transmettre des variables d’environnement à l’aide de l’option --env :

    snow sql -q "select '<% ctx.env.test %>'" --env test=value_from_cli
    
    Copy
  • Par défaut, Snowflake CLI supprime de la sortie les commentaires de la requête SQL. L’exemple suivant utilise l’option --retain-comments pour inclure les commentaires dans les résultats de la requête.

    Supposons que le fichier example.sql contienne les instructions et commentaires suivants :

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

    Lorsque vous exécutez la commande suivante, -- My comment apparaît dans les résultats de la requête.

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