分隔識別碼 (Database Engine)
符合識別碼格式所有規則的識別碼,不一定要使用分隔符號。不符合一般識別碼格式規則的識別碼,一定要分隔。
[!附註]
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 中,可以使用 SET QUOTED_IDENTIFIER、ALTER DATABASE 的 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 名稱解譯成三個部分的名稱,應使用符號來分隔資料表名稱部分。
EXEC sp_help 'dbo.[tab.one]';
以下顯示以雙引號分隔同一個資料表名稱的範例:
SET QUOTED_IDENTIFIER ON;
GO
EXEC sp_help 'dbo."tab.one"';
GO
變更記錄
更新的內容 |
---|
已更正「分隔識別碼的規則」底下的敘述,指出尾端空白會與物件名稱一起儲存,並加入使用分隔物件名稱時的最佳作法建議。 |
請參閱