共用方式為


分隔識別碼 (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 

變更記錄

更新的內容

已更正「分隔識別碼的規則」底下的敘述,指出尾端空白會與物件名稱一起儲存,並加入使用分隔物件名稱時的最佳作法建議。