Сбой хранимой процедуры SQL Server из-за использования параметров XML / ANSI_NULLS, QUOTED_IDENTIFIER - PullRequest
7 голосов
/ 11 ноября 2009

У меня есть хранимая процедура, которая принимает параметр XML и вставляет данные в несколько таблиц. Если я запускаю хранимую процедуру в базе данных, используя окно запросов SSMS, все работает нормально. Однако у нас есть специальная программа установки, которая используется для развертывания хранимых процедур в базах данных, и при ее использовании выполнение sp завершается с ошибкой:

INSERT failed because the following SET options have incorrect settings:
'ANSI_NULLS, QUOTED_IDENTIFIER'. Verify that SET options are correct for use with
indexed views and/or indexes on computed columns and/or query notifications 
and/or xml data type methods.

Пользовательская программа установки не использует правильные настройки при написании сценариев в хранимых процедурах.

Установка этих параметров (SET ARITHABORT ON; SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON;) в sp не имеет никакого эффекта:

Я также попытался установить эти параметры для открытого соединения непосредственно перед вызовом sp в коде. Это снова не дает желаемого эффекта.

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

Я экспериментировал, играя с этими настройками в настройках SSMS, и это действительно так. Я просто хотел бы, чтобы кто-то подтвердил, что это определенно имеет место (если есть способ, я бы хотел это услышать, но я не надеюсь)

К сожалению, изменение программы установки в настоящее время для меня не вариант, поэтому я смотрю на необходимость откатить пару недель работы; поэтому, если мне нужно сделать это, я хочу быть действительно уверенным (и иметь некоторые доказательства, чтобы поддержать меня), что это единственный вариант

1 Ответ

11 голосов
/ 11 ноября 2009

Настройки применяются с настройками CREATE или ALTER и игнорируются во время выполнения.

SSMS имеет правильные настройки по умолчанию (как и sqlcmd, osql и т. Д.).

С BOL, CREATE PROC, «Использование параметров SET»

Database Engine сохраняет настройки SET QUOTED_IDENTIFIER и SET ANSI_NULLS при сохранении Transact-SQL процедура создана или изменена. Эти оригинальные настройки используются, когда хранимая процедура выполнена. Поэтому любые настройки сеанса клиента для SET QUOTED_IDENTIFIER и SET ANSI_NULLS игнорируются при сохранении процедура запущена. Другой набор такие параметры, как SET ARITHABORT, SET ANSI_WARNINGS или SET ANSI_PADDINGS не сохраняются при сохранении процедуры создан или изменен.

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