Мы только что столкнулись с проблемой, когда одна из сохраненных процедур выдает ошибку;
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
Я исправил это, изменив сохраненную процедуру и установив для цитируемого идентификатора значение ON. Дело в том, что я сделал это до вызова CREATE PROCEDURE. Например;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[InsertStuff]
Я бы подумал, что это повлияет на оператор CREATE PROCEDURE, но не повлияет ни на что, связанное с выполнением этой процедуры.
Все наши сценарии развертываются как сценарии drop and create и запускаются через sqlcmd. Я только что прочитал здесь (выполните поиск по примеру: Выполнение SQLCMD) и здесь, что sqlcmd выполняется с < strong> цитируемый идентификатор выключен. Я изменил наш сценарий, включив переключатель -I, чтобы посмотреть, решит ли это наши проблемы.
Тогда мои вопросы;
1) Влияет ли оператор SET QUOTED_IDENTIFIER ON только на оператор DDL CREATE PROCEDURE или он также влияет на выполнение сохраненной процедуры? Мой быстрый тест указывает на последнее.
2) Поскольку по умолчанию этот переключатель включен, я предполагаю, что установка переключателя -I
в моем запросе sqlcmd не окажет отрицательного воздействия. Во всех смыслах и целях я предполагаю, что это то же самое, что копировать содержимое скрипта, а затем вставлять его в диспетчер запросов и нажимать «Выполнить». Пожалуйста, поправьте меня, если я ошибаюсь. Наш простой сценарий развертывания выглядит следующим образом:
@echo off
SET dbodir=../Schema Objects/Schemas/dbo/Programmability/Stored Procedures/
SET tpmdir=../Schema Objects/Schemas/TPM/Programmability/Stored Procedures/
echo --- Starting dbo schema
for %%f in ("%dbodir%*.sql") do (echo Running %%f.... && @sqlcmd -I -U %1 -P %2 -S %3 -d %4 -i "%dbodir%%%f")
echo --- Completed dbo schema
echo --- Starting TPM schema
for %%g in ("%tpmdir%*.sql") do (echo Running %%g.... && @sqlcmd -I -U %1 -P %2 -S %3 -d %4 -i "%tpmdir%%%g")
echo --- Completed TPM schema
pause
заранее спасибо
Изменить:
Кажется, что есть дополнительная информация, чтобы определить, где находятся параметры SET для сохраненные процедуры сохраняются, и принятый ответ на это предоставляет некоторые подробности об общих правилах, касающихся общего порядка приоритета, который применяется к параметрам SET. В комментариях к этому также говорится, что;
«... Во время создания процедуры фиксируются только параметры QUOTED_IDENTIFER и ANSI_NULLS». «... SET QUOTED IDENTIFIER не может быть установлен во время выполнения внутри сохраненной процедуры» (выделено мной).
Я чувствую, что это отвечает на мой первый вопрос.
Есть ли желающие на вторую часть?