SET QUOTED_IDENTIFIER (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Menyebabkan SQL Server mengikuti aturan ISO mengenai tanda kutip yang memisahkan pengidentifikasi dan string harfiah. Pengidentifikasi yang dibatasi oleh tanda kutip ganda dapat berupa kata kunci yang dipesan Transact-SQL atau dapat berisi karakter yang umumnya tidak diizinkan oleh aturan sintaks Transact-SQL untuk pengidentifikasi.

Konvensi sintaks transact-SQL

Sintaksis

-- 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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Keterangan

Ketika SET QUOTED_IDENTIFIER AKTIF (default), pengidentifikasi dapat dibatasi dengan tanda kutip ganda (" "), dan literal harus dibatasi dengan tanda kutip tunggal (' '). Semua string yang dibatasi oleh tanda kutip ganda ditafsirkan sebagai pengidentifikasi objek. Oleh karena itu, pengidentifikasi yang dikutip tidak harus mengikuti aturan Transact-SQL untuk pengidentifikasi. Mereka dapat dipesan kata kunci dan dapat menyertakan karakter yang umumnya tidak diizinkan dalam pengidentifikasi Transact-SQL. Tanda kutip ganda tidak dapat digunakan untuk memisahkan ekspresi string harfiah; tanda kutip tunggal harus digunakan untuk mengapit string literal. Jika tanda kutip tunggal (') adalah bagian dari string literal, tanda kutip tunggal dapat diwakili oleh dua tanda kutip tunggal (''). SET QUOTED_IDENTIFIER harus AKTIF ketika kata kunci yang dicadangkan digunakan untuk nama objek dalam database.

Saat SET QUOTED_IDENTIFIER NONAKTIF, pengidentifikasi tidak dapat dikutip dan harus mengikuti semua aturan Transact-SQL untuk pengidentifikasi. Untuk informasi selengkapnya, lihat Pengidentifikasi Database. Literal dapat dibatasi dengan tanda kutip tunggal atau ganda. Jika string literal dibatasi oleh tanda kutip ganda, string dapat berisi tanda kutip tunggal yang disematkan, seperti apostrof.

Catatan

QUOTED_IDENTIFIER tidak memengaruhi pengidentifikasi yang dibatasi yang diapit dalam tanda kurung siku ([ ]).

SET QUOTED_IDENTIFIER harus AKTIF saat Anda membuat atau mengubah indeks pada kolom komputasi atau tampilan terindeks. Jika SET QUOTED_IDENTIFIER NONAKTIF, pernyataan CREATE, UPDATE, INSERT, dan DELETE akan gagal pada tabel dengan indeks pada kolom komputasi, atau tabel dengan tampilan terindeks. Untuk informasi selengkapnya tentang pengaturan opsi SET yang diperlukan dengan tampilan dan indeks terindeks pada kolom komputasi, lihat Pertimbangan saat Anda menggunakan pernyataan SET.

SET QUOTED_IDENTIFIER harus AKTIF saat Anda membuat indeks yang difilter.

SET QUOTED_IDENTIFIER harus AKTIF saat Anda memanggil metode jenis data XML.

Driver ODBC Klien Asli SQL Server dan Penyedia OLE DB Klien Asli SQL Server untuk SQL Server secara otomatis mengatur QUOTED_IDENTIFIER ke AKTIF saat menyambungkan. Ini dapat dikonfigurasi di sumber data ODBC, di atribut koneksi ODBC, atau properti koneksi OLE DB. Default untuk SET QUOTED_IDENTIFIER NONAKTIF untuk koneksi dari aplikasi DB-Library.

Saat tabel dibuat, opsi PENGIDENTIFIKASI KUTIPan selalu disimpan sebagai AKTIF dalam metadata tabel meskipun opsi diatur ke NONAKTIF saat tabel dibuat.

Saat prosedur tersimpan dibuat, pengaturan SET QUOTED_IDENTIFIER dan SET ANSI_NULLS diambil dan digunakan untuk pemanggilan prosedur tersimpan berikutnya.

Ketika dijalankan di dalam prosedur tersimpan, pengaturan SET QUOTED_IDENTIFIER tidak diubah.

Ketika SET ANSI_DEFAULTS AKTIF, QUOTED_IDENTIFIER juga AKTIF.

SET QUOTED_IDENTIFIER juga sesuai dengan pengaturan QUOTED_IDENTIFIER ALTER DATABASE.

SET QUOTED_IDENTIFIER berlaku pada waktu penguraian Transact-SQL dan hanya memengaruhi penguraian, bukan pengoptimalan kueri atau eksekusi kueri.

Untuk penguraian batch ad hoc tingkat atas dimulai menggunakan pengaturan sesi saat ini untuk QUOTED_IDENTIFIER. Karena batch diurai, setiap kemunculan akan mengubah perilaku penguraian SET QUOTED_IDENTIFIER dari titik tersebut, dan menyimpan pengaturan tersebut untuk sesi. Jadi setelah batch diurai dan dijalankan, pengaturan QUOTED_IDENTIFIER sesi akan diatur sesuai dengan kejadian SET QUOTED_IDENTIFIER terakhir dalam batch.

Static Transact-SQL dalam prosedur tersimpan diurai menggunakan pengaturan QUOTED_IDENTIFIER yang berlaku untuk batch yang membuat atau mengubah prosedur tersimpan. SET QUOTED_IDENTIFIER tidak berpengaruh ketika muncul dalam isi prosedur tersimpan sebagai Transact-SQL statis.

Untuk batch berlapis menggunakan sp_executesql atau exec(), penguraian mulai menggunakan pengaturan QUOTED_IDENTIFIER sesi. Jika batch berlapis berada di dalam prosedur tersimpan, penguraian mulai menggunakan pengaturan QUOTED_IDENTIFIER prosedur tersimpan. Saat batch berlapis diurai, setiap kemunculan akan mengubah perilaku penguraian SET QUOTED_IDENTIFIER dari titik itu, tetapi pengaturan QUOTED_IDENTIFIER sesi tidak akan diperbarui.

Untuk menampilkan pengaturan saat ini untuk pengaturan ini, jalankan kueri berikut:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 ) 
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Izin

Memerlukan keanggotaan dalam peran tersebut PUBLIC .

Contoh

J. Menggunakan pengaturan pengidentifikasi yang dikutip dan nama objek kata yang dipesan

Contoh berikut menunjukkan bahwa SET QUOTED_IDENTIFIER pengaturan harus ON, dan kata kunci dalam nama tabel harus dalam tanda kutip ganda untuk membuat dan menggunakan objek yang memiliki nama kata kunci yang dipesan.

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. Menggunakan pengaturan pengidentifikasi yang dikutip dengan tanda kutip tunggal dan ganda

Contoh berikut menunjukkan cara tanda kutip tunggal dan ganda digunakan dalam ekspresi string dengan SET QUOTED_IDENTIFIER diatur ke ON dan 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

Berikut adalah hasil yang ditetapkan.

 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

Lihat Juga

MEMBUAT DATABASE
BUAT DEFAULT
CREATE PROCEDURE
BUAT ATURAN
CREATE TABLE
BUAT PEMICU
CREATE VIEW
Jenis Data
EXECUTE
SELECT
Pernyataan SET
SET ANSI_DEFAULTS
sp_rename
Pengidentifikasi Database