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 }
동작 비교¶
SQL Server 동작¶
SQL Server에서 SET QUOTED_IDENTIFIER 설정에 따라 큰따옴표가 해석되는 방식이 결정됩니다.
ON인 경우(기본값): 큰따옴표로 식별자가 구분되므로 오브젝트 이름에 특수 문자와 예약된 키워드가 허용됩니다.
OFF인 경우: 큰따옴표가 문자열 리터럴 구분 기호로 처리됩니다(작은따옴표와 유사).
Snowflake 동작¶
Snowflake는 항상 큰따옴표를 식별자 구분 기호로 처리합니다(SQL Server의 QUOTED_IDENTIFIER ON). OFF 설정에 해당하는 항목이 없습니다. 주요 차이는 다음과 같습니다.
대/소문자 구분:
따옴표가 없는 식별자는 자동으로 대문자로 변환됩니다.
따옴표가 있는 식별자는 대/소문자가 정확히 유지되고 대/소문자가 구분됩니다.
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";
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";
차이점의 예
대/소문자를 구분하지 않는 데이터 정렬(_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";
이 경우 _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
Snowflake는 기본적으로 따옴표가 있는 식별자의 대/소문자를 구분하므로 동작이 달라집니다. 여기에는 사용 중인 세션을 변경하여 접근할 수 있습니다.
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
계정 수준에서 매개 변수를 설정하려면 다음 명령을 사용할 수 있습니다.
ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
그러면 계정과 연결된 모든 세션에 대한 매개 변수가 설정됩니다. 자세한 내용은 다음 설명서를 참조하세요.
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];
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";
마이그레이션 고려 사항¶
식별자 대/소문자 검토: Snowflake로 마이그레이션할 때, 특히 따옴표가 있는 식별자의 경우 일관된 대/소문자를 보장합니다.
문자열 리터럴: 큰따옴표가 있는 문자열 리터럴을 작은따옴표가 있는 리터럴로 바꾸기
QUOTED_IDENTIFIERS_IGNORE_CASE 사용: 마이그레이션 초기 단계에 이 매개 변수를
TRUE로 설정하여 대/소문자 구분 문제를 줄이는 것이 좋습니다.철저한 테스트: 마이그레이션 후 모든 오브젝트 참조가 올바르게 작동하는지 확인