SET QUOTED_IDENTIFIER (Transact-SQL)
適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 azure Synapse Analytics Platform System (PDW) MICROSOFT Fabric Warehouse in Microsoft Fabric 中的 SQL 分析端點
使 SQL Server 遵循以引號分隔識別碼與常值字串的 ISO 規則。 以雙引號分隔的識別碼可能是 Transact-SQL 的保留關鍵字,或是包含 Transact-SQL 的識別碼語法規則通常不允許的字元。
Syntax
-- Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics, and Microsoft Fabric
SET QUOTED_IDENTIFIER { ON | OFF }
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
SET QUOTED_IDENTIFIER ON
注意
若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件。
備註
當 SET QUOTED_IDENTIFIER
為 ON (預設值) 時,識別碼可由雙引號分隔 (" "),且常值必須由單引號分隔 (' ')。 用雙引號來分隔的所有字串都會解譯為物件識別碼。 因此,用引號括住的識別碼不需要遵照 Transact-SQL 的識別碼規則。 它們可以是保留關鍵字,也可以包括 Transact-SQL 識別碼通常不允許的字元。 文字字串運算式不能用雙引號來分隔;您必須用單引號來括住文字字串。 如果單引號 (') 是常值字串的一部分,則可以用兩個單引號 (") 來代表。 當資料庫中的物件名稱使用保留關鍵字時,SET QUOTED_IDENTIFIER
必須為 ON。
當 SET QUOTED_IDENTIFIER
為 OFF 時,識別碼不能用引號括住,而且必須遵循所有 Transact-SQL 識別碼規則。 如需詳細資訊,請參閱< Database Identifiers>。 文字可以用單引號或雙引號來分隔。 如果用雙引號來分隔文字字串,字串便可以包含內嵌的單引號,如撇號。
注意
QUOTED_IDENTIFIER 不會影響以中括弧 ([ ]) 分隔的識別碼。
當要建立或變更計算資料行上的索引或索引檢視表時,SET QUOTED_IDENTIFIER
必須為 ON。 如果 SET QUOTED_IDENTIFIER
為 OFF,則在具有計算資料行索引的資料表,或索引檢視表的資料表中,CREATE、UPDATE、INSERT 和 DELETE 陳述式皆會失敗。 如需含索引檢視表和計算資料行索引的必要 SET 選項設定詳細資訊,請參閱使用 SET 陳述式時的考量。
當要建立篩選索引時,SET QUOTED_IDENTIFIER
必須為 ON。
當叫用 XML 資料類型方法時,SET QUOTED_IDENTIFIER
必須為 ON。
適用於 SQL Server 的 SQL Server Native Client ODBC 驅動程式和 SQL Server Native Client OLE DB 提供者在連線時,都會自動將 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 時,則 QUOTED_IDENTIFIER 也同時為 ON。
另外,SET QUOTED_IDENTIFIER
也對應於 ALTER DATABASE 的 QUOTED_IDENTIFIER 設定。
SET QUOTED_IDENTIFIER
會在 Transact-SQL 剖析時生效,而且只會影響剖析,不會影響查詢最佳化或查詢執行。
針對最上層的隨選批次,剖析會使用工作階段針對 QUOTED_IDENTIFIER 的目前設定開始。 在剖析批次的同時,任何出現 SET QUOTED_IDENTIFIER
的地方,都會從該點之後變更剖析的行為,並針對工作階段儲存該設定。 因此,在剖析和執行批次之後,會話的QUOTED_IDENTIFIER設定將會根據批次中最後一個出現次數 SET QUOTED_IDENTIFIER
來設定。
位於預存程序中的靜態 Transact-SQL 是使用對於建立或修改預存程序的批次有效的 QUOTED_IDENTIFIER 設定進行剖析。 SET QUOTED_IDENTIFIER
作為靜態 Transact-SQL 出現在預存程序的主體時沒有任何作用。
針對使用 sp_executesql
或 exec()
的巢狀批次,剖析會使用工作階段的 QUOTED_IDENTIFIER 設定開始。 如果巢狀批次位於預存程序之中,則剖析會使用預存程序的 QUOTED_IDENTIFIER 設定啟動。 在剖析巢狀批次的同時,任何出現 SET QUOTED_IDENTIFIER
的地方,都會從該點之後變更剖析的行為,但工作階段的 QUOTED_IDENTIFIER 將不會更新。
若要檢視此設定的目前設定,請執行下列查詢:
DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 )
BEGIN
SET @QUOTED_IDENTIFIER = 'ON';
END
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;
權限
需要 PUBLIC
角色中的成員資格。
範例
A. 使用引號識別碼設定及保留字物件名稱
下列範例會顯示 SET QUOTED_IDENTIFIER
設定必須是 ON
,且資料表名稱中的關鍵字必須用雙引號括住,才能建立和使用含保留字名稱的物件。
SET QUOTED_IDENTIFIER OFF
GO
-- Create statement fails.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO
SET QUOTED_IDENTIFIER ON;
GO
-- Create statement succeeds.
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 AdventureWorks2022;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Test')
DROP TABLE dbo.Test;
GO
USE AdventureWorks2022;
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
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
Data types (資料類型)
EXECUTE
選取
SET 陳述式
SET ANSI_DEFAULTS
sp_rename
資料庫識別碼
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應