SET QUOTED_IDENTIFIER (Transact-SQL)
讓 SQL Server 遵照有關分隔識別碼和常值字串之引號的 ISO 規則。 用雙引號定界的識別碼可以是 Transact-SQL 保留關鍵字,也可以包含 Transact-SQL 的識別碼語法規則通常不接受的字元。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure 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 設定為何,都可以使用方括號 [ 和 ] 分隔識別碼。
若要檢視此設定的目前設定,請執行下列查詢。
DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 ) SET @QUOTED_IDENTIFIER = 'ON';
SELECT @QUOTED_IDENTIFIER AS 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 (SQL Server Transact-SQL)
CREATE PROCEDURE (Transact-SQL)