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 %>
형식이며, -D
(또는 --variable
) 옵션은 변수 값을 지정합니다.
참고
현재 템플릿에 SnowSQL
&variable_name
및<% variable_name %>
구문을 사용할 수 있습니다. 그러나 Snowflake는<% 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
프로젝트 정의 파일에서 변수와 값을 정의할 수 있습니다. 그런 다음 -D "<variable> = <value>"
옵션을 사용하는 대신, 변수 이름을 <% ctx.env.<variable_name> %>
형식으로 지정할 수 있습니다.
이전 섹션의 예제를 사용하여 데이터베이스 및 역할 변수를 snowflake.yml
파일에 저장하고 쿼리를 다음으로 변경할 수 있습니다.
snow sql -q "grant usage on database <% ctx.env.database %> to <% ctx.env.role %>"
이 예제에서 snow sql
명령은 프로젝트 정의 파일에서 변수 정의를 찾아서 명령줄에 표시하지 않고 값을 추출합니다. snowflake.yml
파일은 현재 작업 디렉터리 또는 -p
옵션으로 지정한 위치에 있어야 합니다.
프로젝트 정의 파일에 이러한 값을 저장하는 방법에 대한 자세한 내용은 SQL에서 변수 사용하기 섹션을 참조하십시오.
비동기적으로 SQL 쿼리 실행하기¶
Snowflake CLI 를 사용하면 하나 이상의 SQL 쿼리를 비동기적으로 실행할 수 있습니다. 결과를 기다리는 대신, snow sql
명령은 Snowflake에서 쿼리를 예약하고 쿼리 ID 를 반환합니다. 쿼리가 완료되면 !result 쿼리 명령 또는 SQL RESULT_SCAN 명령을 사용하여 결과를 확인할 수 있습니다.
SQL 쿼리를 비동기적으로 실행하려면 아래에 표시된 것처럼 ;
대신 ;>
로 쿼리를 끝내십시오.
snow sql -q 'select "My async query" ;>'
다음은 단일 쿼리를 비동기적으로 실행하는 예입니다.
snow sql -q "select 'This is async query';>"
select 'This is async query'
+--------------------------------------+
| scheduled query ID |
|--------------------------------------|
| 01bc3011-080f-f2d7-0001-c1be14bae7c2 |
+--------------------------------------+
그런 다음 !result 쿼리 명령에 반환된 쿼리ID 를 사용하여 쿼리 결과를 표시할 수 있습니다.
snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
path-to-private-key-file
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query |
+-----------------------+
아래 표시된 것처럼, 쿼리 문자열에서 비동기 및 동기식으로 여러 쿼리를 실행할 수도 있습니다.
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 |
+--------------------------------------+
SQL 쿼리 명령으로 작업하기¶
Snowflake CLI 는 SQL 쿼리 내에서 사용할 수 있는 다음 명령을 제공합니다.
로컬 파일 또는 URL에서 SQL 을 실행하는 !source.
모든 SQL 쿼리를 나열하는 !queries.
SQL 쿼리의 결과를 표시하는 !result.
활성 SQL 쿼리를 중단하는 !abort.
팁
SQL 쿼리를 작은따옴표(''
)가 아닌 큰따옴표(""
)로 묶는 경우 사용하는 셸에 따라 느낌표(!
)를 이스케이프해야 할 수 있습니다.
로컬 파일 또는 URL에서 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
쿼리 주위에 작은따옴표(''
) 대신 큰따옴표(""
)를 사용하는 경우 사용하는 셸에 따라 !
(\!
)를 이스케이프해야 할 수도 있습니다.
다음 예에서는 원본 파일을 실행할 수 있는 다양한 방법을 보여줍니다.
로컬 파일에서 코드를 실행합니다.
이 예에서는 로컬 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
별칭을 지원합니다.
모든 SQL 쿼리 나열하기¶
!queries
쿼리 명령은 계정에 대한 모든 쿼리를 나열합니다. 기본적으로, 이 명령은 현재 세션에서 실행된 가장 최근 쿼리 25개를 나열합니다.
예를 들어, 다음 !queries
쿼리 명령은 특정 사용자에 대한 가장 최근 쿼리 3개를 반환합니다.
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 | +-------------------------------------------------------------------------------------------------------------------------------------+
다음 필터를 사용하여 반환된 쿼리 목록의 범위를 좁힐 수 있습니다.
필터 |
기본값 |
설명 |
---|---|---|
amount(정수) |
25 |
반환할 최근 쿼리 수입니다(기본값: 25개). |
session(boolean) |
N/A |
제공된 경우 현재 세션에서 실행된 쿼리만 반환합니다. |
warehouse(string) |
없음 |
지정된 웨어하우스에서만 실행된 쿼리를 반환합니다. |
user(string) |
없음 |
지정된 사용자에 의해서만 실행된 쿼리를 반환합니다. |
duration(밀리초) |
0 |
지정된 시간(밀리초) 이상 걸린 쿼리만 반환합니다. |
start_date(string) |
없음 |
지정된 날짜 이후에 실행된 쿼리만 반환합니다. 날짜는 ISO 형식으로 입력해야 합니다(예 - |
end_date(string) |
없음 |
지정된 날짜 이전에 실행된 쿼리만 반환합니다. 날짜는 ISO 형식으로 입력해야 합니다(예 - |
duration(정수) |
없음 |
지정된 Unix 타임스탬프(밀리초) 이후에 실행된 쿼리만 반환합니다. |
end(정수) |
없음 |
지정된 Unix 타임스탬프(밀리초) 이전에 실행된 쿼리만 반환합니다. |
status(열거형) |
없음 |
다음 상태 중 하나에 해당하는 쿼리만 반환합니다.
|
타입 |
없음 |
다음 유형 중 하나의 쿼리만 반환합니다.
|
다음은 서로 다른 필터를 사용하여 쿼리를 반환하는 예입니다.
현재 세션에서 실행된 가장 최근 쿼리 25개를 반환합니다.
snow sql -q 'select 42; select 15; !queries session'
계정에서 가장 최근에 실행된 쿼리 20개를 반환합니다.
snow sql -q '!queries amount=20'
실행에 200 밀리초 이상이 소요된 계정에서 실행된 가장 최근 쿼리 20개를 반환합니다.
snow sql -q '!queries amount=20 duration=200'
지정된 웨어하우스에서 가장 최근에 실행된 쿼리 25개를 반환합니다.
snow sql -q '!queries warehouse=mywh'
완료된 SQL 쿼리 결과 반환하기¶
!result
쿼리 명령은 쿼리 ID 가 주어졌을 때 완료된 쿼리 결과를 반환합니다. 다음 방법으로 ID 쿼리를 얻을 수 있습니다.
snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query |
+-----------------------+
활성 SQL 쿼리 중단하기¶
!abort
쿼리 명령은 쿼리 ID 가 주어졌을 때 활성 쿼리를 중단합니다. 다음 방법으로 ID 쿼리를 얻을 수 있습니다.
snow sql -q '!abort 01bc3011-080f-f2d7-0001-c1be14bae7c2'
+-------------------------------------------------------------+
| SYSTEM$CANCEL_QUERY('01BC3011-080F-F2D7-0001-C1BE14BAE7C2') |
|-------------------------------------------------------------|
| Identified SQL statement is not currently executing. |
+-------------------------------------------------------------+
단일 트랜잭션에 여러 명령 입력하기¶
--single-transaction
옵션을 사용하면 여러 개의 SQL 명령을 입력하여 전부 또는 전무 명령 세트로 실행할 수 있습니다. 단일 트랜잭션에서 명령을 실행하면 변경 사항을 커밋하기 전에 모든 명령이 성공적으로 완료되었는지 확인할 수 있습니다. 명령 중 하나라도 실패하면 성공한 명령의 변경 사항이 유지되지 않습니다.
다음 예는 성공적인 트랜잭션과 실패한 트랜잭션을 보여줍니다.
성공적인 명령 실행
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. | +----------------------------------+
그런 다음 명령이 데이터베이스에 커밋되었는지 확인할 수 있습니다.
snow sql -q "select count(*) from my_tbl"
select count(*) from my_tbl +----------+ | COUNT(*) | |----------| | 2 | +----------+
실패한 단일 트랜잭션
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' │ ╰───────────────────────────────────────────────────────────────────────────────────────╯
그런 다음 명령이 데이터베이스에 커밋되지 않았는지 확인할 수 있습니다.
snow sql -q "select count(*) from my_tbl"select count(*) from my_tbl +----------+ | COUNT(*) | |----------| | 0 | +----------+
대화형 모드에서 SQL 명령 입력하기¶
snow sql
명령은 SQL 명령을 한 번에 하나씩 입력할 수 있는 대화형 모드를 지원합니다. 대화형 모드는 다음과 같은 기능을 제공합니다.
구문 강조 표시
입력 중 코드 완성
검색 가능한 기록
CTRL-R: 을 누르면 명령 기록을 검색할 수 있습니다.
다중 라인 입력
세미콜론으로 끝나지 않는 줄에서 ENTER (
;
)를 누르면 문이 세미콜론으로 끝날 때까지 커서가 다음 줄로 이동하여 더 많은 명령을 볼 수 있습니다.
대화형 모드를 사용하려면 아래에 표시된 것처럼 snow sql
명령을 입력한 다음에 ENTER 를 누릅니다.
snow sql
이 명령은 SQL 명령을 대화형으로 입력할 수 있는 >
프롬프트가 있는 하위 셸을 엽니다.
$ snow sql
╭───────────────────────────────────────────────────────────────────────────────────╮
│ Welcome to Snowflake-CLI REPL │
│ Type 'exit' or 'quit' to leave │
╰───────────────────────────────────────────────────────────────────────────────────╯
>
그런 다음 아래와 같이 SQL 명령을 입력할 수 있습니다.
> create table my_table (c1 int);
+-------------------------------------+
| status |
|-------------------------------------|
| Table MY_TABLE successfully created.|
+-------------------------------------+
참고
각 SQL 문은 세미콜론으로 끝내야 합니다(;
).
대화형 모드를 종료하려면 exit
, quit
를 입력하거나 CTRL-D 를 누릅니다.