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 陳述式會在執行任何陳述式之前生效。

權限

需要 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 AdventureWorks
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test
GO
USE AdventureWorks
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