SET QUOTED_IDENTIFIER (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

使 SQL Server 遵循以引號分隔識別碼與常值字串的 ISO 規則。 以雙引號分隔的識別碼可能是 Transact-SQL 的保留關鍵字,或是包含 Transact-SQL 的識別碼語法規則通常不允許的字元。

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL 資料庫、Azure Synapse Analytics 中的無伺服器 SQL 集區,以及 Microsoft Fabric 的語法。

SET QUOTED_IDENTIFIER { ON | OFF }

Azure Synapse Analytics 和平行處理數據倉儲的語法。

SET QUOTED_IDENTIFIER ON

注意

若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件

備註

SET QUOTED_IDENTIFIERON 時,標識碼可以用雙引號分隔(""),而且常值必須以單引號分隔('')。 用雙引號來分隔的所有字串都會解譯為物件識別碼。 附加引號的識別碼不必遵循 Transact-SQL 的識別碼規則。 它們可以是關鍵字,也可以包括 Transact-SQL 識別碼不允許的字元。 如果雙引號 (") 是識別碼的一部分,則可以以兩個雙引號 ("") 來表示。 SET QUOTED_IDENTIFIER 必須是 ON 當保留關鍵詞用於資料庫中的物件名稱時。

當 為 OFFSET QUOTED_IDENTIFIER,標識碼不能加上引號,而且必須遵循標識碼的所有 Transact-SQL 規則。 如需詳細資訊,請參閱 資料庫標識符。 文字可以用單引號或雙引號來分隔。 如果用雙引號來分隔文字字串,字串便可以包含內嵌的單引號,如撇號。

注意

QUOTED_IDENTIFIER不會影響以括弧 (和]) 括住的分隔標識符。[

當要建立或變更計算資料行上的索引或索引檢視表時,SET QUOTED_IDENTIFIER 必須為 ON。 如果 SET QUOTED_IDENTIFIEROFF,則 CREATE、、 INSERTUPDATEDELETE 語句會在計算數據行的索引或具有索引檢視表的數據表上失敗。 如需在計算數據行上使用索引檢視表和索引的必要 SET 選項設定詳細資訊,請參閱 使用SET語句時的考慮。

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

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

SQL Server Native Client ODBC 驅動程式和 SQL Server Native Client OLE DB Provider for SQL Server 連線時會自動設定 QUOTED_IDENTIFIERON 。 您可以在 ODBC 資料來源、ODBC 連接屬性或 OLE DB 連接屬性中設定這個項目。 的預設值 SET QUOTED_IDENTIFIEROFF DB-Library 應用程式的連線。

建立資料表時, QUOTED IDENTIFIER 選項一律會儲存在 ON 資料表的元資料中,即使選項在建立資料表時設定 OFF 為 。

建立預存程式時,會 SET QUOTED_IDENTIFIER 擷取 和 SET ANSI_NULLS 設定,並用於該預存程式的後續調用。

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

當 為 ONSET ANSI_DEFAULTSQUOTED_IDENTIFIER也是 ON

SET QUOTED_IDENTIFIER會對應至 QUOTED_IDENTIFIER ALTER DATABASE設定。

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_executesqlexec()的巢狀批次,剖析會從 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 設為 ONOFF 的字串運算式中,單引號和雙引號的使用方式。

SET QUOTED_IDENTIFIER OFF;
GO

USE AdventureWorks2022;
GO

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