Подтвердить что ты не робот

Ошибка неправильной настройки 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
4b9b3361

Ответ 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