SET QUOTED_IDENTIFIER (Transact-SQL)
Заставляет SQL Server 2005 следовать правилам SQL-92 относительно кавычек, разделяющих идентификаторы и строки-литералы. Идентификаторы, заключенные в двойные кавычки, могут быть либо зарезервированными ключевыми словами Transact-SQL, либо могут содержать символы, которые обычно запрещены правилами синтаксиса для идентификаторов Transact-SQL.
Соглашения о синтаксисе в Transact-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 должно быть присвоено значение OFF. Если параметр SET QUOTED_IDENTIFIER имеет значение OFF, то в таблицах с индексами инструкции CREATE, UPDATE, INSERT и DELETE в вычисляемых столбцах или индексированных представлениях не будут работать. Дополнительные сведения о настройке параметров SET с индексированными представлениями и индексами на вычисляемых столбцах см. в подразделе «Анализ использования инструкций SET» раздела SET (Transact-SQL).
Драйвер ODBC для собственного клиента SQL и поставщик OLE DB для собственного клиента SQL для SQL Server автоматически присваивают параметру QUOTED_IDENTIFIER значение ON при соединении. Это может быть настроено в источниках данных ODBC, в атрибутах соединения ODBC или свойствах соединения OLE DB. По умолчанию параметр SET QUOTED_IDENTIFIER имеет значение OFF для соединений из приложений DB-Library.
После создания таблицы параметр QUOTED IDENTIFIER всегда записывается в метаданные таблицы со значением ON, даже если он был установлен в OFF при создании таблицы.
Когда создается хранимая процедура, параметры SET QUOTED_IDENTIFIER и SET ANSI_NULLS фиксируются и используются для последующих вызовов этой хранимой процедуры.
При выполнении операций внутри хранимой процедуры значение SET QUOTED_IDENTIFIER не меняется.
Если параметр SET ANSI_DEFAULTS имеет значение ON, параметр SET QUOTED_IDENTIFIER включается.
Также параметр SET QUOTED_IDENTIFIER связан с настройками QUOTED_IDENTIFER инструкции ALTER DATABASE. Дополнительные сведения о настройке свойств базы данных см. в разделах ALTER DATABASE (Transact-SQL) и Установка параметров базы данных.
Параметр SET QUOTED_IDENTIFIER устанавливается во время синтаксического анализа. Настройка на время синтаксического анализа означает, что если инструкция SET присутствует в пакете или хранимой процедуре, она выполняется вне зависимости от того, достигает ли выполнение кода фактически этой точки. Кроме того, инструкция SET выполняется до выполнения любых инструкций.
Разрешения
Требуется членство в роли public.
Примеры
А. Использование режима заключенных в кавычки идентификаторов и имен объектов, состоящих из зарезервированных слов
В следующем примере показано, что параметр 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
Б. Использование настроек заключенного в кавычки идентификатора с двойными и одинарными кавычками
В этом примере показано, как используются двойные и одинарные кавычки в строковых выражениях, если параметру SET QUOTED_IDENTIFIER
присвоено значение ON
и значение OFF
.
SET QUOTED_IDENTIFIER OFF
GO
USE AdventureWorks
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Test')
DROP TABLE dbo.Test
GO
USE AdventureWorks
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 (Transact-SQL)
CREATE DEFAULT (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE RULE (Transact-SQL)
CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE VIEW (Transact-SQL)
Типы данных (Transact-SQL)
EXECUTE (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
sp_rename (Transact-SQL)