SET QUOTED IDENTIFIER должен быть включен при вставке записи - PullRequest
9 голосов
/ 16 июля 2009

Я застрял в довольно странной проблеме с SQL Server 2005, которая выдает

"SET QUOTED IDENTIFIER должен быть включен при вставке записи"

(используется в качестве SP) для конкретной таблицы. Ранее это работало нормально, но выдает эту ошибку случайно.

Я проверил SP. Мы не указывали вручную параметры SET QUOTED IDENTIFIER внутри, поэтому по умолчанию он должен быть включен.

Может кто-нибудь уточнить, в чем может быть проблема?

Таблица должна быть создана с SET QUOTED IDENTIFIER ON, верно? Я еще не проверял скрипт таблицы.

Я заметил, что эта проблема возникает только в том случае, если поставщики услуг выполняют вставку или обновление в столбце даты (updatedAt) ... Пример значения: '2009-08-10 06: 43: 59: 447' ..

Есть ли проблема с переданными значениями?

Ответы [ 4 ]

24 голосов
/ 12 августа 2009

После долгой борьбы нам удалось решить эту проблему. Я просто хотел поделиться причиной.

Наша команда по сборке поддерживает отдельный внутренний инструмент для развертывания сценариев, который запускает служебную программу SQLCMD (shell) для выполнения сценариев T-SQL в БД.

Вот виновник: по умолчанию, QUOTED_IDENTIFIER равно OFF при работе в режиме SQLCMD!

Каждый скрипт, запускаемый этим инструментом, создается с помощью QUOTED IDENTIFIER OFF. Мы единственный модуль, который использует индексированные представления. Все остальные истории вы хорошо знаете в моих предыдущих постах: (

ПРИМЕЧАНИЕ: я собираюсь голосовать за все посты за полезные.

5 голосов
/ 16 июля 2009

Сценарий сохраненного процесса, обеспечение / изменение параметров SET, запуск ALTER PROC, чтобы убедиться, что установлено SET QUOTED IDENTIFIER ON.

Почему?

Настройка «УСТАНОВИТЬ ИДЕНТИФИКАТОР ЦИТАТЫ» определяется во время создания для сохраненных процедур и всегда «ВКЛ» для таблиц. Источник, BOL .

Когда таблица создана, котируется Опция IDENTIFIER всегда сохраняется как ON в метаданных таблицы, даже если опция выключена, когда таблица создано.

Когда создается хранимая процедура, SET QUOTED_IDENTIFIER и SET Настройки ANSI_NULLS фиксируются и используется для последующих вызовов эта хранимая процедура.

Значение по умолчанию для соединений может быть определено на уровне сервера (sp_configure 'user options') или на уровне базы данных (ALTER DATABASE). Для SSMS он находится в разделе «Инструменты .. Опции. Выполнение запроса. Сервер SQL. ANSI». Это также по умолчанию для клиентских библиотек (кроме DB-LIb).

Теперь, если вы откроете окно запроса SSMS и начнете набирать «CREATE PROC ..», то при запуске кода будут использоваться настройки SSMS.

И SET QUOTED IDENTIFIER нельзя установить во время выполнения внутри сохраненного процесса. Покажите мне ссылку, прежде чем вы не согласны ... Из ссылки MS BOL выше:

При исполнении внутри хранимой процедура, настройка SET QUOTED_IDENTIFIER не изменяется.

Вы должны усердно работать, чтобы выполнить любой код с этим OFF ... так что наиболее вероятное исправление - это ALTER или воссоздание сохраненного процесса.

1 голос
/ 16 июля 2009

Я только что читал эту статью Эрланда Соммарскога, Проклятие и благословения динамического SQL , и он включает в себя следующий абзац относительно установки SET QUOTED IDENTIFIER:

По умолчанию для этого настройка зависит от контекста, но предпочтительная настройка включена, и она должна быть включенным, чтобы использовать XQuery, проиндексированный представления и индексы для вычисляемых столбцов.

Использует ли ваша хранимая процедура XQuery, индексированные представления или индексы для вычисляемых столбцов?

1 голос
/ 16 июля 2009

В SQL Server 2005 функция SET QUOTED IDENTIFIER по умолчанию выключена, а не включена (если только не используется соединение ODBC или OLE ... см. это для получения дополнительной информации).

Вам не нужно создавать таблицу с параметром SET QUOTED IDENTIFIER ON, чтобы использовать ее.

Все, что вам нужно сделать, это добавить SET QUOTED IDENTIFIER ON в начало вашего SP, чтобы включить его для запуска процедуры (и убедиться, что, если вы не хотите оставлять его включенным, у вас есть SET QUOTED IDENTIFIER ВЫКЛ, чтобы переключить его обратно).

EDIT

Я стою исправлено. В соответствии с этой MSDN Page , SET QUOTED IDENTIFIER включен по умолчанию (если только не соединение с приложением DB-Library.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...