Ошибка неправильной настройки SET при создании проекта базы данных
Мы используем Visual Studio и проект базы данных для создания нашей базы данных.
Я только что сделал ряд изменений в базе данных (включая добавление новой таблицы с именем Correspondence
), импортировал эти изменения в проект базы данных и попытался развернуть (перестроить) базу данных.
Когда я это сделаю, я получаю следующую ошибку:
Создание [dbo]. [Корреспонденция]... Msg 1934, уровень 16, состояние 1, сервер (имя сервера), строка 1 CREATE TABLE не удалось, поскольку следующие параметры SET имеют неправильные настройки: "ANSI_WARNINGS, ANSI_PADDING". Убедитесь, что параметры SET верны для использования. с индексированными представлениями и/или индексами на вычисленных столбцах и/или отфильтрованных индексов и/или запросы запросов и/или методы типа данных XML и/или пространственный индекс операции.
Может кто-нибудь объяснить эту ошибку мне и помочь мне решить ее? Здесь script используется проект базы данных для создания этой таблицы.
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
Ответы
Ответ 1
Согласно 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
Я бы рекомендовал настроить эти два параметра в script до создания таблицы и связанных индексов.
Ответ 2
Я нашел решение этой проблемы:
- Перейдите в Свойства сервера.
- Выберите вкладку "Подключения".
- Проверьте, не снята ли опция ansi_padding.
Ответ 3
В моем случае я пытался создать таблицу из одной базы данных в другую на MS SQL Server 2012. Щелкнув правой кнопкой мыши по таблице и выбрав Script Таблица как > DROP AND CREATE To > New Query Editor Window, был создан script:
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
Однако при выполнении выше script он возвращал ошибку:
SELECT не удалось, так как следующие параметры SET были неверными настройки: "ANSI_PADDING". Убедитесь, что параметры SET верны для использования. с индексированными представлениями и/или индексами на вычисленных столбцах и/или отфильтрованными индексы и/или уведомления запросов и/или методы типа данных XML и/или операции пространственного индекса.
Решение, которое я нашел: включение настроек в верхней части script следующим образом:
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
Надеюсь на эту помощь.
Ответ 4
Для меня просто отлично работает уровень совместимости с более высоким уровнем. Чтобы увидеть C.Level:
select compatibility_level from sys.databases where name = [your_database]
Ответ 5
В моем случае я обнаружил, что вычисляемый столбец был добавлен во "включенные столбцы" индекса. Позже, когда элемент в этой таблице был обновлен, оператор merge
не смог выполнить это сообщение. Слияние было в триггере, так что это было трудно отследить! Удаление вычисляемого столбца из индекса исправило его.
Ответ 6
У меня была такая же проблема с отфильтрованным индексом, и мои вставки и обновления терпели неудачу. Все, что я сделал, это изменил хранимую процедуру с оператором вставки и обновления на:
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