Мы только столкнулись с проблемой, когда одна из наших хранимых процедур выкинула ошибку;
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, но не повлияло бы на какое-либо действие с выполнением этой процедуры.
Наши скрипты развернуты как откат, так и создают скрипты и запускаются через sqlcmd. Я только что прочитал, что здесь (поиск для примера: Выполнение SQLCMD) и здесь что sqlcmd выполняется с указанным идентификатором. Я изменил наш script, включив ключ -I, чтобы проверить, устраняет ли это наши проблемы.
Теперь мои вопросы:
1) Выполняет ли оператор SET QUOTED_IDENTIFIER ON только инструкцию DDL CREATE PROCEDURE или влияет также на выполнение хранимой процедуры? Мой быстрый тест показывает последний.
2) Поскольку значение по умолчанию для этого переключателя включено, я предполагаю, что при установке переключателя -I
моего запроса sqlcmd не будет никаких негативных последствий. Для всех целей и целей я буду считать, что это то же самое, что копировать содержимое script, а затем вставлять их в диспетчер запросов и выполнять выполнение. Пожалуйста, поправьте меня, если я ошибаюсь. Наше простое развертывание script выглядит следующим образом:
@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 для сохраненных procs, и принятый ответ на это предоставляет некоторые сведения об общих правилах в отношении общего порядка приоритета, который применяется к параметрам SET. В комментариях к этому также указывается, что
"... Только настройки QUOTED_IDENTIFER и ANSI_NULLS фиксируются во время создания процедуры." "... SET QUOTED IDENTIFIER не может быть установлен во время выполнения внутри хранимой процедуры" (мой акцент).
Я чувствую, что отвечает на мой первый вопрос.
Любые участники второй части?