SET QUOTED_IDENTIFIER (Transact-SQL)

讓 SQL Server 遵照有關分隔識別碼和常值字串之引號的 ISO 規則。用雙引號定界的識別碼可以是 Transact-SQL 保留關鍵字,也可以包含 Transact-SQL 的識別碼語法規則通常不接受的字元。

主題連結圖示Transact-SQL 語法慣例

語法

SET QUOTED_IDENTIFIER { ON | OFF }

備註

當 SET QUOTED_IDENTIFIER 是 ON 時,您可以用雙引號來分隔識別碼,文字則必須用單引號來分隔。當 SET QUOTED_IDENTIFIER 是 OFF 時,識別碼不能附加引號,且必須遵照所有 Transact-SQL 識別碼規則。如需詳細資訊,請參閱<識別碼>。文字可以用單引號或雙引號來分隔。

當 SET QUOTED_IDENTIFIER 是 ON (預設值) 時,用雙引號來分隔的所有字串都會解譯為物件識別碼。因此,附加引號的識別碼不需要遵照 Transact-SQL 的識別碼規則。它們可以是保留關鍵字,也可以包括 Transact-SQL 識別碼通常不接受的字元。文字字串運算式不能用雙引號來分隔;您必須用單引號來括住文字字串。如果單引號 (') 是文字字串的一部份,您可以用兩個單引號 (") 來表示它。當資料庫中的物件名稱使用保留關鍵字時,SET QUOTED_IDENTIFIER 必須是 ON。

當 SET QUOTED_IDENTIFIER 是 OFF 時,您可以用單引號或雙引號來分隔運算式中的文字字串。如果用雙引號來分隔文字字串,字串便可以包含內嵌的單引號,如撇號。

當您建立或變更計算資料行索引或索引檢視時,SET QUOTED_IDENTIFIER 也必須是 ON。如果 SET QUOTED_IDENTIFIER 是 OFF,含計算資料行索引的資料表或索引檢視之 CREATE、UPDATE、INSERT 和 DELETE 陳述式會失敗。如需有關含索引檢視和計算資料行索引之必要 SET 選項設定的詳細資訊,請參閱<SET (Transact-SQL)>中的「使用 SET 陳述式時的考量」一節。

SQL Server Native Client ODBC 驅動程式和 SQL Server Native Client OLE DB Provider for SQL Server 在連接之時,都會將 QUOTED_IDENTIFIER 設為 ON。您可以在 ODBC 資料來源、ODBC 連接屬性或 OLE DB 連接屬性中設定這個項目。起始於 DB-Library 應用程式的連接之 SET QUOTED_IDENTIFIER 預設值是 OFF。

當建立資料表時,一律會在資料表的中繼資料中,將 QUOTED IDENTIFIER 選項儲存成 ON,即使建立資料表時,將選項設成 OFF,也是如此。

當建立預存程序時,會擷取 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 設定,這個預存程序的後續引動過程都會使用這些設定。

當在預存程序內執行時,不會變更 SET QUOTED_IDENTIFIER 的設定。

當 SET ANSI_DEFAULTS 是 ON 時,會啟用 SET QUOTED_IDENTIFIER。

另外,SET QUOTED_IDENTIFIER 也對應於 ALTER DATABASE 的 QUOTED_IDENTIFER 設定。如需有關資料庫設定的詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>和<設定資料庫選項>。

SET QUOTED_IDENTIFIER 是在剖析階段設定的。在剖析階段設定意謂著,如果 SET 陳述式在批次或預存程序中,不論程式碼是否實際執行到這一點,它都會生效;SET 陳述式會在執行任何陳述式之前生效。

無論 QUOTED_IDENTIFIER 設定為何,都可以使用方括號 [] 分隔識別碼。

權限

需要 public 角色中的成員資格。

範例

A. 使用附加引號的識別碼設定及保留字物件名稱

下列範例會顯示 SET QUOTED_IDENTIFIER 設定必須是 ON,且資料表名稱中的關鍵字必須用雙引號括住,才能建立和使用含保留字名稱的物件。

SET QUOTED_IDENTIFIER OFF
GO
-- An attempt to create a table with a reserved keyword as a name
-- should fail.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO

SET QUOTED_IDENTIFIER ON;
GO

-- Will succeed.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO

SELECT "identity","order" 
FROM "select"
ORDER BY "order";
GO

DROP TABLE "SELECT";
GO

SET QUOTED_IDENTIFIER OFF;
GO

B. 搭配單引號和雙引號來使用附加引號的識別碼設定

下列範例會顯示在 SET QUOTED_IDENTIFIER 設為 ON 和 OFF 的字串運算式中,單引號和雙引號的使用方式。

SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2008R2;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test;
GO
USE AdventureWorks2008R2;
CREATE TABLE dbo.Test (ID INT, String VARCHAR(30)) ;
GO

-- Literal strings can be in single or double quotation marks.
INSERT INTO dbo.Test VALUES (1, "'Text in single quotes'");
INSERT INTO dbo.Test VALUES (2, '''Text in single quotes''');
INSERT INTO dbo.Test VALUES (3, 'Text with 2 '''' single quotes');
INSERT INTO dbo.Test VALUES (4, '"Text in double quotes"');
INSERT INTO dbo.Test VALUES (5, """Text in double quotes""");
INSERT INTO dbo.Test VALUES (6, "Text with 2 """" double quotes");
GO

SET QUOTED_IDENTIFIER ON;
GO

-- Strings inside double quotation marks are now treated 
-- as object names, so they cannot be used for literals.
INSERT INTO dbo."Test" VALUES (7, 'Text with a single '' quote');
GO

-- Object identifiers do not have to be in double quotation marks
-- if they are not reserved keywords.
SELECT ID, String 
FROM dbo.Test;
GO

DROP TABLE dbo.Test;
GO

SET QUOTED_IDENTIFIER OFF;
GO

以下為結果集:

ID String

----------- ------------------------------

1 'Text in single quotes'

2 'Text in single quotes'

3 Text with 2 '' single quotes

4 "Text in double quotes"

5 "Text in double quotes"

6 Text with 2 "" double quotes

7 Text with a single ' quote