2013-04-23 2 views
4

создать хранимую процедуру с установкой по умолчанию, как:Ошибка удаления/вставки с фильтрованным индексом на SQL Server 2008?

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

Create PROCEDURE [dbo].[TestSP] 
AS 
BEGIN 
    set arithabort off 
    set arithignore on 
    --..... 
END 

Это прекрасно. Затем я создал отфильтрованный уникальный индекс в таблице для не нулевого значения в БД, тогда я больше не могу запускать какую-либо хранимую процедуру в SQL Server Management Studio. Я получаю ошибку что-то вроде:

DELETE (или INSERT) не потому, что следующие параметры SET имеют неправильные параметры: 'ANSI_NULLS, QUOTED_IDENTIFIER'. Убедитесь, что параметры SET верны для использования с индексированными представлениями и/или индексами для вычисленных столбцов и/или отфильтрованных индексов и/или уведомлений запросов и/или методов типа данных XML и/или операций пространственного индекса.

Я пытаюсь запустить хранимую процедуру, как:

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
EXEC TestSP 

Или

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
EXEC TestSP 

Я все еще получаю выше ошибки. Я очень смущен. Как решить эту проблему?

+1

Что произойдет, если ansi_nulls установлен при создании хранимой процедуры? –

+1

Почему вы создали процедуру с этими двумя настройками 'OFF'? Вы знаете, что ['SET ANSI_NULLS OFF' устарел с SQL Server 2005] (http://msdn.microsoft.com/en-us/library/ms143729 (v = sql.90) .aspx), правильно? Прекратите использовать его. –

ответ

1

установки для обоих ANSI_NULLS и QUOTED_IDENTIFIER основаны на том, что эти параметры при создании/изменить процедуру, а не настройки в случае запуска процедуры в.

Вы хотите запустить ALTER PROC для ваш TestSP, который устанавливает, по крайней мере, QUOTED_IDENTIFIER в положение ON при его запуске.

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[TestSP] 

AS 
BEGIN 
    set arithabort off 
    set arithignore on 
    --..... 
END 
0

Возможно, это проблема SQL Server (непоследовательность?). Ошибка «INSERT не удалось, потому что следующие параметры SET имеют неправильные параметры:„QUOTED_IDENTIFIER“будет генерироваться, если выполняются следующие условия:

  • таблица содержит столбец, позволяющий NULLs, но значение по умолчанию не было определено, экс :

[LookupID] [int] NULL

  • существует единственный фильтруется индекс, определенный на этой колонке

Решение: добавить по умолчанию ограничение в колонке [LookupID]:

ALTER TABLE [tablename] add CONSTRAINT [DF_TableName_lookupID] DEFAULT (NULL) FOR [lookupID] 
0

Я просто столкнулся с этой ситуацией, и причина была связана с картотеку и развернуть процесс мой проект базы данных на Visual Studio (т. е. myDatabase.dbproj).

Коренной причиной ошибки является контекст, в котором должна быть создана хранимая процедура. Параметры базы данных ANSI_NULLS и QUOTED_IDENTIFIER должны быть установлены до созданная хранимая процедура (установка этих опций в sp-код не является ошибкой, но бесполезна).

Хранимая процедура запускается, если я копирую и вставляю ее источник в SQL Server Management Studio, поэтому я был уверен, что проблема была вызвана различием в параметрах SET в контексте развертывания. Затем я проверил эти параметры (Database.sqlsettings) и все было нормально: ANSI_NULLS и QUOTED_IDENTIFIER были правильно установлены, но проблема все еще осталась ...

Пока я не нашел что каждый объектный файл имеет Properties запись в базе данных project (щелкните правой кнопкой мыши по имени файла, чтобы отобразить диалоговое окно). Эти свойства фактически переписывали настройки базы данных, поэтому я изменил их на Project Default, и проблема была решена.

sql-file-properies-dialog

PS: Я сделал несколько тестов создание новых хранимых процедур из Visual Studio и импортирующие созданные вручную из них с помощью схемы сравнения и файлы создаются с Project Default, так что я думаю, что этот параметр был изменен вручную или неправильно импортированный из предыдущей версии Visual Studio.

 Смежные вопросы

  • Нет связанных вопросов^_^