Ошибка «Неправильные параметры SET» при создании проекта базы данных - PullRequest
34 голосов
/ 11 февраля 2012

Мы используем Visual Studio и проект базы данных для генерации нашей базы данных.

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

При этом я получаю следующую ошибку:

Создание [dbo]. [Переписка] ... Msg 1934, Уровень16, состояние 1, сервер (имя сервера), строка 1 CREATE TABLE завершилась неудачно, поскольку следующие параметры SET имеют неправильные настройки: «ANSI_WARNINGS, ANSI_PADDING».Убедитесь, что параметры SET верны для использования с индексированными представлениями и / или индексами для вычисляемых столбцов и / или отфильтрованных индексов и / или уведомлений о запросах, и / или методов типа данных XML, и / или операций с пространственным индексом.

Может ли кто-нибудь объяснить мне эту ошибку и помочь мне решить ее?Вот скрипт, который проект базы данных использует для создания этой таблицы.

PRINT N'Creating [dbo].[Correspondence]...';
GO

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO

CREATE TABLE [dbo].[Correspondence] (
    [Id]                INT              IDENTITY (1, 1) NOT NULL,
    [WorkbookId]        INT              NOT NULL,
    [ProviderId]        UNIQUEIDENTIFIER NOT NULL,
    [MessageThreadId]   INT              NOT NULL,
    [MessageThreadType] AS               ((1)) PERSISTED NOT NULL
);
GO

SET ANSI_NULLS, QUOTED_IDENTIFIER OFF;
GO

PRINT N'Creating PK_Correspondence...';
GO

ALTER TABLE [dbo].[Correspondence]
ADD CONSTRAINT [PK_Correspondence] PRIMARY KEY CLUSTERED ([Id] ASC)
    WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF,
    IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
GO

Ответы [ 6 ]

80 голосов
/ 11 февраля 2012

Согласно BOL :

Индексированные представления и индексы для вычисляемых столбцов сохраняют результаты в базе данных для последующего использования.Сохраненные результаты действительны только в том случае, если все соединения, относящиеся к индексированному представлению или индексированному вычисляемому столбцу, могут генерировать тот же набор результатов, что и соединение, создавшее индекс.

Для создания таблицы с сохраненнымВ вычисляемом столбце должны быть включены следующие параметры подключения:

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT ON
SET QUOTED_IDENTIFIER ON

Эти значения устанавливаются на уровне базы данных и могут быть просмотрены с помощью:

SELECT 
    is_ansi_nulls_on,
    is_ansi_padding_on,
    is_ansi_warnings_on,
    is_arithabort_on,
    is_concat_null_yields_null_on,
    is_numeric_roundabort_on,
    is_quoted_identifier_on
FROM sys.databases

Однако Параметры SET также могут быть установлены клиентским приложением , подключающимся к SQL Server.

Прекрасным примером является SQL Server Management Studio, в котором значения по умолчанию для SET ANSI_NULLS и SET QUOTED_IDENTIFIER установлены в ON.Это одна из причин, почему я не смог изначально дублировать ошибку, которую вы опубликовали.

В любом случае, попробуйте повторить ошибку (это переопределит настройки SSMS по умолчанию):

SET ANSI_NULLS ON
SET ANSI_PADDING OFF
SET ANSI_WARNINGS OFF
SET ARITHABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON 
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE T1 (
    ID INT NOT NULL,
    TypeVal AS ((1)) PERSISTED NOT NULL
) 

Вы можете исправить приведенный выше тестовый пример, используя:

SET ANSI_PADDING ON
SET ANSI_WARNINGS ON

Я бы рекомендовал настроить эти две настройки в вашем скрипте перед созданием таблицы и связанных с ней индексов.

2 голосов
/ 25 августа 2016

В моем случае я пытался создать таблицу из одной базы данных в другую на MS SQL Server 2012. Щелкните правой кнопкой мыши по таблице и выберите Таблица сценариев как> DROP AND CREATE To> Новое окно редактора запросов , был создан следующий сценарий:

USE [SAMPLECOMPANY]
GO

ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [FK_Employees_Departments]
GO

/****** Object:  Table [dbo].[Employees]    Script Date: 8/24/2016 9:31:15 PM ******/
DROP TABLE [dbo].[Employees]
GO

/****** Object:  Table [dbo].[Employees]    Script Date: 8/24/2016 9:31:15 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Employees](
    [EmployeeId] [int] IDENTITY(1,1) NOT NULL,
    [DepartmentId] [int] NOT NULL,
    [FullName] [varchar](50) NOT NULL,
    [HireDate] [datetime] NULL
 CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
(
    [EmployeeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Employees]  WITH CHECK ADD  CONSTRAINT [FK_Employees_Departments] FOREIGN KEY([DepartmentId])
REFERENCES [dbo].[Departments] ([DepartmentID])
GO

ALTER TABLE [dbo].[Employees] CHECK CONSTRAINT [FK_Employees_Departments]
GO

Однако при выполнении вышеописанного сценария возвращалась ошибка:

ВЫБРАТЬ не удалось, поскольку следующие параметры SET имеют неверные настройки: 'ANSI_PADDING',Убедитесь, что параметры SET верны для использования с индексированными представлениями и / или индексами для вычисляемых столбцов и / или отфильтрованных индексов и / или уведомлений о запросах, и / или методов типа данных XML, и / или операций с пространственным индексом.

Решение, которое я нашел: Включение настроек в верхней части скрипта следующим образом:

USE [SAMPLECOMPANY]
GO
/****** Object:  Table [dbo].[Employees]    Script Date: 8/24/2016 9:31:15 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [FK_Employees_Departments]
GO

/****** Object:  Table [dbo].[Employees]    Script Date: 8/24/2016 9:31:15 PM ******/
DROP TABLE [dbo].[Employees]
GO



CREATE TABLE [dbo].[Employees](
    [EmployeeId] [int] IDENTITY(1,1) NOT NULL,
    [DepartmentId] [int] NOT NULL,
    [FullName] [varchar](50) NOT NULL,
    [HireDate] [datetime] NULL
 CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
(
    [EmployeeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Employees]  WITH CHECK ADD  CONSTRAINT [FK_Employees_Departments] FOREIGN KEY([DepartmentId])
REFERENCES [dbo].[Departments] ([DepartmentID])
GO

ALTER TABLE [dbo].[Employees] CHECK CONSTRAINT [FK_Employees_Departments]
GO

SET ANSI_PADDING OFF
GO

Надеюсь, эта помощь.

2 голосов
/ 15 апреля 2013

Я нашел решение этой проблемы:

  1. Перейти к свойствам сервера.
  2. Выберите вкладку Подключения .
  3. Проверьте, не отключена ли опция ansi_padding .
0 голосов
/ 03 июня 2019

У меня была такая же проблема с отфильтрованным индексом, и мои вставки и обновления не выполнялись. Все, что я сделал, это изменил хранимую процедуру с оператором вставки и обновления на:

create procedure abc
()
AS
BEGIN
SET NOCOUNT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_WARNINGS ON 
SET ANSI_PADDING ON 
end
0 голосов
/ 12 апреля 2019

В моем случае я обнаружил, что вычисляемый столбец был добавлен во «включенные столбцы» индекса. Позже, когда элемент в этой таблице был обновлен, оператор merge не смог выполнить это сообщение. Слияние было в триггере, так что это было трудно отследить! Удаление вычисляемого столбца из индекса исправило его.

0 голосов
/ 16 марта 2017

Для меня просто установка уровня совместимости на более высокий уровень работает нормально.Чтобы увидеть C.Level:

select compatibility_level from sys.databases where name = [your_database]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...