Sdílet prostřednictvím


NASTAV QUOTED_IDENTIFIER (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Způsobuje, že SQL Server dodržuje pravidla ISO týkající se uvozovek a literálních řetězců. Identifikátory ohraničené dvojitými uvozovkami mohou být buď Transact-SQL vyhrazených klíčových slov, nebo mohou obsahovat znaky, které nejsou obecně povoleny pravidly syntaxe Transact-SQL pro identifikátory.

Transact-SQL konvence syntaxe

Syntaxe

Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics a Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Syntaxe pro Azure Synapse Analytics a paralelní datový sklad

SET QUOTED_IDENTIFIER ON

Poznámky

Když SET QUOTED_IDENTIFIER je ( ON výchozí), identifikátory lze vymezit dvojitými uvozovkami (""), a literály musí být vymezeny jednotlivými uvozovkami (''). Všechny řetězce vymezené dvojitými uvozovkami jsou interpretovány jako identifikátory objektů. Citované identifikátory nemusí dodržovat pravidla Transact-SQL pro identifikátory. Mohou to být klíčová slova a mohou obsahovat znaky, které nejsou povoleny v Transact-SQL identifikátorech. Pokud je součástí identifikátoru dvojitá uvozovka ("), lze ji reprezentovat dvěma dvojitými uvozovkami (""). SET QUOTED_IDENTIFIER musí být při ON použití rezervovaných klíčových slov pro názvy objektů v databázi.

Když SET QUOTED_IDENTIFIER je OFF, identifikátory nelze citovat a musí dodržovat všechna Transact-SQL pravidla pro identifikátory. Další informace naleznete v tématu Identifikátory databáze. Literály lze ohraničit buď jednoduchými, nebo dvojitými uvozovkami. Pokud je literální řetězec vymezen dvojitými uvozovkami, může obsahovat vložené jednoduché uvozovky, například apostrofy.

Poznámka:

QUOTED_IDENTIFIER neovlivňuje ohraničené identifikátory uzavřené v závorkách ([ a ]).

SET QUOTED_IDENTIFIER musí být ON při vytváření nebo změně indexů na vypočítaných sloupcích nebo indexovaných zobrazeních. Pokud SET QUOTED_IDENTIFIER je , OFFpak CREATE, UPDATE, , INSERT, a DELETE příkazy selhávají u tabulek s indexy na vypočítaných sloupcích nebo v tabulkách s indexovanými zobrazeními. Pro více informací o požadovaných SET nastaveních možností s indexovanými zobrazeními a indexy ve vypočítaných sloupcích viz Úvahy při používání příkazů SET.

SET QUOTED_IDENTIFIER Musí to být ON při vytváření filtrovaného indexu.

SET QUOTED_IDENTIFIERMusí to být ON při volání XML datových typů.

SQL Server Native Client ODBC ovladač a SQL Server Native Client OLE DB Provider pro SQL Server se automaticky nastaví QUOTED_IDENTIFIER při ON připojení. To lze nastavit ve zdrojích dat ODBC, v atributech spojení ODBC nebo ve vlastnostech spojení v databázi OLE. Výchozí SET QUOTED_IDENTIFIER pro je pro OFF spojení z DB-Library aplikací.

Když je tabulka vytvořena, volba QUOTED IDENTIFIER je vždy uložena jako ON v metadatech tabulky, i když je volba nastavena na OFF okamžik vytvoření tabulky.

Když je vytvořena uložená procedura, SET QUOTED_IDENTIFIER nastavení a jsou SET ANSI_NULLS zachycena a použita pro následné volání této uložené procedury.

Při spuštění v uložené procedurě se nastavení nemění SET QUOTED_IDENTIFIER .

Když SET ANSI_DEFAULTS je ON, QUOTED_IDENTIFIER je také ON.

SET QUOTED_IDENTIFIERodpovídá QUOTED_IDENTIFIER nastavení ALTER DATABASE.

SET QUOTED_IDENTIFIER působí v Transact-SQL době parsování a ovlivňuje pouze parsování, nikoli optimalizaci dotazů nebo provádění dotazů.

Pro ad hoc dávku nejvyšší úrovně začíná parsování pomocí aktuálního nastavení relace pro QUOTED_IDENTIFIER. Při parsování batch se každé výskyt SET QUOTED_IDENTIFIER změní chování parsování od tohoto okamžiku dál, a toto nastavení si uložte pro relaci. Takže po parsování a spuštění batch bude nastavení relace QUOTED_IDENTIFIER nastaveno podle posledního výskytu v SET QUOTED_IDENTIFIER dávce.

Statický Transact-SQL v uložené procedurě se parsuje pomocí QUOTED_IDENTIFIER nastavení platného pro dávku, která uloženou proceduru vytvořila nebo změnila. SET QUOTED_IDENTIFIER nemá žádný vliv, když se v těle uložené procedury objeví jako statický Transact-SQL.

Pro vnořenou dávku pomocí sp_executesql nebo exec(), začíná parsování pomocí QUOTED_IDENTIFIER nastavení relace. Pokud je vnořená dávka uvnitř uložené procedury, začíná parsování pomocí QUOTED_IDENTIFIER nastavení uložené procedury. Při parsování vnořené série se SET QUOTED_IDENTIFIER od té chvíle mění jakékoli její výskyt, ale nastavení relace QUOTED_IDENTIFIER se neaktualizuje.

Pro zobrazení aktuálního nastavení tohoto nastavení spusťte následující dotaz:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';

IF ((256 & @@OPTIONS) = 256)
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Povolení

Vyžaduje členství ve veřejné roli .

Examples

A. Použijte nastavení identifikátorů s úvodovkami a názvy objektů vyhrazených slov

Následující příklad ukazuje, že SET QUOTED_IDENTIFIER nastavení musí být ON, a klíčová slova v názvech tabulek musí být v uvozovkách, aby bylo možné vytvářet a používat objekty s rezervovanými názvy klíčových slov.

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. Použijte nastavení identifikátoru s úvodkami s jednou a dvojitou uvozovkou

Následující příklad ukazuje, jak se používají jednoduché a dvojité uvozovky v řetězcových výrazech s SET QUOTED_IDENTIFIER nastavením na ON a OFF.

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

Tady je soubor výsledků.

 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