구분 식별자(데이터베이스 엔진)
식별자 형식 규칙에 맞는 모든 식별자는 구분 기호와 함께 또는 구분 기호 없이 사용할 수 있습니다. 일반 식별자의 형식 규칙에 맞지 않는 식별자는 항상 구분되어야 합니다.
[!참고]
MicrosoftSQL Server는 구분된 변수 이름 및 저장 프로시저 매개 변수를 인식하지 못합니다. 이러한 유형의 식별자는 일반 식별자 규칙에 맞아야 합니다.
구분 식별자는 다음과 같은 상황에서 사용됩니다.
개체 이름 또는 개체 이름의 일부로 예약어가 사용될 때
예약 키워드는 개체 이름으로 사용할 수 없습니다. 이전 버전의 SQL Server에서 업그레이드된 데이터베이스에서는 이전 버전의 예약어는 아니지만 현재 버전의 SQL Server의 예약어가 들어 있는 식별자를 포함할 수 있습니다. 이름을 변경할 수 있을 때까지 구분 식별자를 사용하여 개체를 참조할 수 있습니다.
정규화된 식별자가 아닌 문자를 사용할 때
SQL Server에서는 현재 코드 페이지에 있는 모든 문자를 구분 식별자에 사용할 수 있습니다. 그러나 개체 이름에 특수 문자를 무분별하게 사용하면 SQL 문 및 스크립트를 읽고 유지 관리하기가 어려워 질 수 있습니다. 예를 들어 Employee]라는 이름으로 테이블을 만들 수 있으며 여기서 닫는 대괄호는 이름의 일부입니다. 이런 경우 다음과 같이 대괄호를 두 개 더 사용하여 대괄호를 닫아야 합니다.
CREATE TABLE [Employee]]] ( EmployeeID int IDENTITY (1,1) NOT NULL, FirstName varchar(30), LastName varchar(30) );
[!참고]
구분 기호는 식별자에만 사용됩니다. 구분 기호는 SQL Server에서 예약된 것으로 표시되더라도 키워드로 사용할 수 없습니다.
구분 기호 유형
다음은 Transact-SQL에서 사용되는 구분 기호의 유형입니다.
따옴표가 붙은 식별자는 큰따옴표(")로 구분됩니다.
SELECT * FROM "Blanks in Table Name";
대괄호로 묶인 식별자는 대괄호([ ])로 구분됩니다.
SELECT * FROM [Blanks In Table Name];
따옴표 붙은 식별자는 QUOTED_IDENTIFIER 옵션을 ON으로 설정할 때만 유효합니다. 기본적으로 Microsoft OLE DB Provider for SQL Server 및 SQL Server ODBC 드라이버는 연결할 때 QUOTED_IDENTIFIER를 ON으로 설정합니다.
사용되는 인터페이스와 관계없이 각 응용 프로그램 또는 사용자는 언제든지 설정을 변경할 수 있습니다. SQL Server에서는 여러 가지 방법으로 이 옵션을 지정할 수 있습니다. 예를 들어 SQL Server Management Studio에서는 이 옵션을 대화 상자에서 설정할 수 있습니다. Transact-SQL에서는 ALTER DATABASE의 QUOTED_IDENTIFIER 옵션인 SET QUOTED_IDENTIFIER 또는 sp_configure의 user options 옵션을 사용하여 이 옵션을 여러 수준으로 설정할 수 있습니다.
QUOTED_IDENTIFIER가 ON으로 설정되면 SQL Server는 SQL 문에서 ISO 규칙에 따라 큰따옴표(")와 작은따옴표(')를 사용합니다. 예를 들면 다음과 같습니다.
큰따옴표는 식별자를 구분할 때만 사용하며 문자열을 구분할 때는 사용할 수 없습니다.
기존 응용 프로그램과의 호환성을 유지하기 위해 SQL Server에서는 이 규칙을 완전히 따르지는 않습니다. 문자열이 식별자의 길이를 초과하지 않으면 큰따옴표로 묶을 수 있지만 이는 별로 권장할 만한 방법은 아닙니다.
작은따옴표는 문자열을 묶을 때 사용해야 하며 식별자를 구분할 때는 사용할 수 없습니다.
문자열에 작은따옴표가 들어 있으면 포함된 작은따옴표 앞에 하나를 더 추가하십시오. 예를 들면 다음과 같습니다.
SELECT * FROM "My Table" WHERE "Last Name" = 'O''Brien';
QUOTED_IDENTIFIER가 OFF로 설정되면 SQL Server는 다음과 같은 작은따옴표 및 큰따옴표 규칙을 사용합니다.
식별자를 구분할 때는 따옴표를 사용할 수 없습니다. 대신 대괄호를 구분 기호로 사용해야 합니다.
작은따옴표나 큰따옴표를 사용하여 문자열을 묶을 수 있습니다.
큰따옴표를 사용할 때는 작은따옴표가 포함되어 있어도 하나 더 추가하지 않아도 됩니다. 예를 들면 다음과 같습니다.
SELECT * FROM [My Table] WHERE [Last Name] = "O'Brien";
대괄호로 묶인 구분 기호는 QUOTED_IDENTIFIER의 설정에 관계없이 항상 사용할 수 있습니다.
구분 식별자 규칙
구분 식별자 형식의 규칙은 다음과 같습니다.
구분 식별자에는 일반 식별자와 같은 문자 수를 포함할 수 있습니다. 즉, 구분 기호 문자를 제외하고 문자를 1개에서 128개까지 포함할 수 있습니다. 로컬 임시 테이블 식별자는 최고 116자를 포함할 수 있습니다.
식별자에는 구분 기호 자체를 제외한 현재 코드 페이지 문자의 모든 조합을 사용할 수 있습니다. 예를 들어 구분 식별자에는 공백, 일반 식별자에 유효한 문자 및 다음 문자가 포함될 수 있습니다.
물결표(~)
하이픈(-)
느낌표(!)
왼쪽 중괄호({)
백분율(%)
오른쪽 중괄호(})
캐럿(^)
아포스트로피(‘)
앰퍼샌드(&)
마침표(.)
왼쪽 괄호(()
백슬래시(\)
오른쪽 괄호())
악센트 기호(`)
개체 명명 시 구분 식별자가 사용되고 개체 이름에 후행 공백이 있는 경우 SQL Server는 후행 공백과 함께 이름을 저장합니다. 식별자 이름을 비교하는 데 사용되는 의미 체계는 문자열 비교와 동일합니다. 따라서 후행 공백이 무시됩니다. 하지만 향후 호환성 문제를 방지하기 위해 구분 기호 내의 모든 문자를 중요하다고 간주하고 구분 식별자 이름을 사용하여 일관성 있게 개체를 참조하는 것이 좋습니다.
다음 예에서는 테이블 이름과 열 이름에 대해 따옴표 붙은 식별자를 사용합니다. 구분 식별자를 지정하는 두 가지 방법은 다음과 같습니다.
SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE "$Employee Data"
(
"^First Name" varchar(25) NOT NULL,
"^Last Name" varchar(25) NOT NULL,
"^Dept ID" int
);
GO
-- INSERT statements go here.
SET QUOTED_IDENTIFIER OFF;
GO
CREATE TABLE [^$Employee Data]
(
[^First Name] varchar(25) NOT NULL,
[^Last Name] varchar(25) NOT NULL,
[^Dept ID] int
);
GO
-- INSERT statements go here.
$Employee Data 및 ^$Employee Data 테이블을 만들고 데이터를 입력한 후 다음과 같이 행을 검색할 수 있습니다.
SET QUOTED_IDENTIFIER ON;
GO
SELECT *
FROM "$Employee Data"
SET QUOTED_IDENTIFIER OFF;
GO
-- Or
SELECT *
FROM [^$Employee Data]
다음 예에서 table이라는 테이블에 tablename, user, select, insert, update 및 delete 열이 들어 있습니다. TABLE, SELECT, INSERT, UPDATE 및 DELETE는 예약된 키워드이므로 개체를 액세스할 때마다 식별자를 구분해야 합니다.
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "table"
(
tablename char(128) NOT NULL,
"USER" char(128) NOT NULL,
"SELECT" char(128) NOT NULL,
"INSERT" char(128) NOT NULL,
"UPDATE" char(128) NOT NULL,
"DELETE" char(128) NOT NULL
);
GO
SET QUOTED_IDENTIFIER 옵션이 ON이 아닐 경우 대괄호 구분 기호를 사용하지 않으면 테이블 및 열에 액세스할 수 없습니다. 예를 들면 다음과 같습니다.
SET QUOTED_IDENTIFIER OFF;
GO
SELECT *
FROM "table";
GO
결과 집합은 다음과 같습니다.:
Msg 170, Level 15, State 1
Line 1: Incorrect syntax near 'table'.
다음 문은 대괄호 구분 기호 때문에 작동합니다.
SET QUOTED_IDENTIFIER OFF;
GO
SELECT *
FROM [table];
GO
여러 부분으로 식별자 구분
정규화된 개체 이름을 사용할 때는 개체 이름을 구성하는 식별자 중 둘 이상을 구분해야 합니다. 각 식별자를 개별적으로 구분해야 합니다. 예를 들면 다음과 같습니다.
/* ISO quoted identifier syntax */
SELECT *
FROM "My DB"."My#UserID"."My.Table";
GO
또는
/* Transact-SQL bracketed identifier syntax */
/* Not available in SQL Server 6.5 or earlier */
SELECT *
FROM [My DB].[My#UserID].[My.Table];
GO
ODBC CALL 문에서 다중 부분으로 된 저장 프로시저를 구분하는 방법에 대한 특별한 규칙이 몇 가지 있습니다. 자세한 내용은 저장 프로시저 호출를 참조하십시오.
SQL Server에서 매개 변수로 식별자 사용
많은 시스템 저장 프로시저, 함수 및 DBCC 문은 개체 이름을 매개 변수로 사용합니다. 이러한 매개 변수 중 일부는 다중 부분 개체 이름을 지원하지만 단일 부분 이름만 지원하는 매개 변수도 있습니다. 단일 부분 이름 또는 다중 부분 이름의 지원 여부에 따라 SQL Server에서 매개 변수가 구문 분석되고 내부적으로 사용되는 방법이 결정됩니다.
단일 부분 매개 변수 이름
매개 변수가 단일 부분 식별자이면 다음과 같이 이름을 지정할 수 있습니다.
따옴표 또는 구분 기호 없이
작은따옴표로 묶어서
큰따옴표로 묶어서
대괄호로 묶어서
단일 부분 이름에서 작은따옴표 내에 있는 문자열은 개체 이름을 나타냅니다. 작은따옴표 내에서 구분 기호가 사용되면 구분 기호 문자가 이름의 일부로 처리됩니다.
이름에 마침표 또는 일반 식별자에 대해 정의된 문자 집합의 일부가 아닌 다른 문자가 들어 있으면 개체 이름을 작은따옴표, 큰따옴표 또는 대괄호로 묶어야 합니다.
다중 부분 매개 변수 이름
다중 부분 이름은 개체 이름에 데이터베이스나 스키마 이름이 추가된 정규화된 이름입니다. SQL Server에서 다중 부분 이름을 매개 변수로 사용하려면 다중 부분 이름을 구성하는 전체 문자열을 작은따옴표 집합으로 묶어야 합니다.
EXEC MyProcedure @name = 'dbo.Employees';
이름 부분마다 구분 기호가 필요하면 필요에 따라 각 이름 부분을 구분해야 합니다. 예를 들어 이름 부분에 마침표, 큰따옴표 또는 왼쪽이나 오른쪽 대괄호가 있으면 대괄호 또는 큰따옴표를 사용하여 부분을 구분하고 작은따옴표로 전체 이름을 묶습니다.
예를 들어 테이블 이름인 tab.one에는 마침표가 들어 있습니다. 이 이름이 dbo.tab.one과 같은 3부분으로 된 이름으로 해석되지 않게 하려면 테이블 이름의 각 부분을 구분합니다.
EXEC sp_help 'dbo.[tab.one]';
다음 예에서는 같은 테이블 이름을 큰따옴표로 구분하여 보여 줍니다.
SET QUOTED_IDENTIFIER ON;
GO
EXEC sp_help 'dbo."tab.one"';
GO
변경 내역
업데이트된 내용 |
---|
후행 공백이 개체 이름과 함께 저장됨을 나타내도록 "구분 식별자 규칙"의 문을 수정했으며 구분된 개체 이름 사용 시 최선의 구현 방법 권장 사항을 추가했습니다. |
참고 항목