SnowConvert AI - SQL Server-Azure Synapse - QUOTED_IDENTIFIER

Applies to
  • SQL 서버

  • Azure 시냅스 분석

설명

이 문은 SQL Server에서 식별자(예: 테이블 이름, 열 이름 등) 또는 문자열 리터럴을 구분하는 데 큰따옴표를 사용할지 여부를 제어합니다. SETQUOTED_IDENTIFIER가 ON이면 식별자는 큰따옴표로 구분할 수 있으며, 리터럴은 작은따옴표로 구분해야 합니다. OFF인 경우 큰따옴표는 문자열 리터럴 구분 기호로 처리됩니다. 이 문에 대한 자세한 내용은 SET QUOTED_IDENTIFIER를 참조하세요.

Transact-SQL 구문

 SET QUOTED_IDENTIFIER { ON | OFF }
Copy

동작 비교

SQL Server 동작

SQL Server에서 SET QUOTED_IDENTIFIER 설정에 따라 큰따옴표가 해석되는 방식이 결정됩니다.

  • ON인 경우(기본값): 큰따옴표로 식별자가 구분되므로 오브젝트 이름에 특수 문자와 예약된 키워드가 허용됩니다.

  • OFF인 경우: 큰따옴표가 문자열 리터럴 구분 기호로 처리됩니다(작은따옴표와 유사).

Snowflake 동작

Snowflake는 항상 큰따옴표를 식별자 구분 기호로 처리합니다(SQL Server의 QUOTED_IDENTIFIER ON). OFF 설정에 해당하는 항목이 없습니다. 주요 차이는 다음과 같습니다.

  1. 대/소문자 구분:

    • 따옴표가 없는 식별자는 자동으로 대문자로 변환됩니다.

    • 따옴표가 있는 식별자는 대/소문자가 정확히 유지되고 대/소문자가 구분됩니다.

  2. QUOTED_IDENTIFIERS_IGNORE_CASE 매개 변수: 따옴표가 있는 식별자의 대/소문자 구분을 제어합니다.

샘플 소스 패턴

SET QUOTED_IDENTIFIER ON

SQL Server에서 QUOTED_IDENTIFIER가 ON이면 공백이나 특수 문자가 포함된 식별자를 구분하는 데 큰따옴표를 사용할 수 있습니다.

SQL 서버

 SET QUOTED_IDENTIFIER ON;
 
 CREATE TABLE "Order Details" (
     "Order ID" INT,
     "Product Name" VARCHAR(50),
     "Unit Price" DECIMAL(10,2)
 );
 
 SELECT "Order ID", "Product Name" FROM "Order Details";
Copy

Snowflake

----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER ON

 CREATE OR REPLACE TABLE "Order Details" (
     "Order ID" INT,
     "Product Name" VARCHAR(50),
     "Unit Price" DECIMAL(10, 2)
 )
 COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "09/22/2025",  "domain": "no-domain-provided" }}'
;

 SELECT
     "Order ID",
     "Product Name"
 FROM
     "Order Details";
Copy

차이점의 예

대/소문자를 구분하지 않는 데이터 정렬(_CI)이 있는 SQL Server 데이터베이스에서 테이블을 마이그레이션했다고 가정해 보겠습니다.

SQL Server(_CI 데이터 정렬 포함):

-- This statement is valid
SELECT "MyColumn" FROM "MyTable";

-- This statement is also valid and returns the same result
SELECT "mycolumn" FROM "MyTable";
Copy

이 경우 _CI 데이터 정렬은 두 SELECT 문은 서로 교환 가능하게 만듭니다.

Snowflake:

-- This statement is valid
SELECT "MyColumn" FROM "MyTable";

-- This statement will fail because "mycolumn" does not match "MyColumn"
SELECT "mycolumn" FROM "MyTable";
-- ERROR:  SQL compilation error: error in select clause: mycolumn does not exist
Copy

Snowflake는 기본적으로 따옴표가 있는 식별자의 대/소문자를 구분하므로 동작이 달라집니다. 여기에는 사용 중인 세션을 변경하여 접근할 수 있습니다.

ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

계정 수준에서 매개 변수를 설정하려면 다음 명령을 사용할 수 있습니다.

ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

그러면 계정과 연결된 모든 세션에 대한 매개 변수가 설정됩니다. 자세한 내용은 다음 설명서를 참조하세요.

SET QUOTED_IDENTIFIER OFF

SQL Server에서 QUOTED_IDENTIFIER가 OFF이면 큰따옴표가 문자열 구분 기호로 취급됩니다.

SQL 서버

 SET QUOTED_IDENTIFIER OFF;
 
 -- Double quotes treated as string literals
 SELECT * FROM customers WHERE name = "John Doe";
 
 -- Must use square brackets for identifiers with spaces
 SELECT [Order ID] FROM [Order Details];
Copy

Snowflake

 ----** SSC-FDM-TS0028 - QUOTED_IDENTIFIER OFF behavior not supported in Snowflake **
 -- Double quotes always delimit identifiers in Snowflake
 -- Use single quotes for string literals
 SELECT * FROM customers WHERE name = 'John Doe';
 
 -- Double quotes delimit identifiers (case-sensitive)
 SELECT "Order ID" FROM "Order Details";
Copy

마이그레이션 고려 사항

  1. 식별자 대/소문자 검토: Snowflake로 마이그레이션할 때, 특히 따옴표가 있는 식별자의 경우 일관된 대/소문자를 보장합니다.

  2. 문자열 리터럴: 큰따옴표가 있는 문자열 리터럴을 작은따옴표가 있는 리터럴로 바꾸기

  3. QUOTED_IDENTIFIERS_IGNORE_CASE 사용: 마이그레이션 초기 단계에 이 매개 변수를 TRUE로 설정하여 대/소문자 구분 문제를 줄이는 것이 좋습니다.

  4. 철저한 테스트: 마이그레이션 후 모든 오브젝트 참조가 올바르게 작동하는지 확인