Share via


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 陳述式時的考量>一節。

當您要建立篩選索引時,SET QUOTED_IDENTIFIER 必須是 ON。

當您叫用 XML 資料類型方法時,SET QUOTED_IDENTIFIER 必須是 ON。

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_IDENTIFIER 設定。 如需有關資料庫設定的詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。

SET QUOTED_IDENTIFIER 是在剖析階段設定的。 在剖析階段設定意謂著,如果 SET 陳述式在批次或預存程序中,不論程式碼是否實際執行到這一點,它都會生效;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 AdventureWorks2012;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test;
GO
USE AdventureWorks2012;
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

請參閱

參考

CREATE DATABASE (Transact-SQL)

CREATE DEFAULT (Transact-SQL)

CREATE PROCEDURE (Transact-SQL)

CREATE RULE (Transact-SQL)

CREATE TABLE (Transact-SQL)

CREATE TRIGGER (Transact-SQL)

CREATE VIEW (Transact-SQL)

資料類型 (Transact-SQL)

EXECUTE (Transact-SQL)

SELECT (Transact-SQL)

SET 陳述式 (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

sp_rename (Transact-SQL)