SnowConvert AI - BigQuery- BigQuery와 Snowflake 간의 식별자 차이

따옴표가 있는 식별자

BigQuery에서 따옴표가 있는 식별자는 역따옴표(`)로 묶지만 Snowflake에서는 큰따옴표(“)로 묶습니다.

BigQuery에서 따옴표가 있는 식별자는 대/소문자 구분 규칙을 따릅니다. 예를 들어 열 이름은 따옴표로 묶은 경우에도 여전히 대/소문자를 구분하지 않습니다.

BigQuery

CREATE TABLE test.quotedIdentTable
(
  `col#1` INTEGER
);

SELECT `col#1` FROM test.quotedIdentTable;

SELECT `COL#1` FROM test.quotedIdentTable;
Copy

Snowflake에서 따옴표가 있는 식별자의 대/소문자 구분은 세션 매개 변수QUOTED_IDENTIFIERS_IGNORE_CASE에 따라 좌우되며, 기본적으로 따옴표가 있는 식별자 비교는 대/소문자를 구분합니다. 즉, 위의 예를 마이그레이션한 결과 코드는 다음과 같습니다.

Snowflake

CREATE TABLE test.quotedIdentTable
(
  "col#1" INTEGER
);

SELECT
  "col#1"
FROM
  test.quotedIdentTable;

SELECT
  "COL#1"
FROM
  test.quotedIdentTable;
Copy

세션 매개 변수가 TRUE로 설정되어 있지 않으면 두 번째 선택을 실행할 때 실패합니다.

SnowConvert AI가 따옴표가 있는 식별자를 마이그레이션하는 방법

SnowConvert AI는 따옴표가 있는 식별자를 분석하여 영숫자가 아닌 문자가 포함되어 있거나 Snowflake의 예약어인지를 확인합니다. 여기에 해당하는 경우 Snowflake에서 따옴표가 있는 식별자로 변환되며, 영숫자 식별자는 따옴표로 묶지 않은 상태로 유지됩니다.

BigQuery

CREATE TABLE `test.identsTable1`
(
  `col#1` INTEGER,
  `col2` INTEGER
);

-- Group is a reserved word
SELECT 
`col#1` AS `group`,
`col2`AS `hello`
FROM
`test.identsTable1`;
Copy

Snowflake

CREATE TABLE test.identsTable1
(
  "col#1" INTEGER,
  col2 INTEGER
);

-- Group is a reserved word
SELECT
  "col#1" AS "group",
  col2 AS hello
FROM
  test.identsTable1;
Copy

알려진 문제

기본적으로, BigQuery는 데이터 세트에 대해 is_case_insensitive 옵션이 활성화되지 않은 한, 테이블 및 데이터 세트 이름을 대/소문자를 구분하는 것으로 간주합니다. 이를 통해 다음 테이블은 문제 없이 공존할 수 있습니다.

BigQuery

CREATE TABLE test.myTable
(
  col1 INTEGER
);

CREATE TABLE test.MyTable
(
  col1 INTEGER
);
Copy

그러나 Snowflake에서 따옴표가 없는 식별자는 항상 대문자로 저장되고 비교됩니다.. 즉 test.MyTable은 오브젝트를 생성하려고 할 때 중복된 오브젝트 오류를 발생시킵니다. 또한 SnowConvert AI는 식별자가 대/소문자를 구분하지 않는다는 가정 하에 작동하므로 변환 중에 이러한 시나리오 중 하나가 나타나면 사용자에게 경고하기 위해 SSC-FDM-0019가 생성됩니다.

Snowflake

CREATE TABLE test.myTable
(
  col1 INTEGER
);

--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR test.MyTable. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE TABLE test.MyTable
(
  col1 INTEGER
);
Copy