Мы только что столкнулись с проблемой, когда один из наших сохраненных процессов выдает ошибку;
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 выполняет с идентификатором в кавычках, отключенным . Я изменил наш сценарий, включив переключатель -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 не может быть установлен во время выполнения внутри хранимой процедуры »(выделено мной).
Я чувствую, что это отвечает на мой первый вопрос.
Есть любители второй части?