2012-02-10 85 views
31

我们正在使用Visual Studio和数据库项目来生成我们的数据库。构建数据库项目时'错误的SET选项'错误

我刚做了一些数据库更改(包括添加一个名为Correspondence的新表),将这些更改导入到数据库项目中,并试图部署(重建)数据库。

当我这样做,我得到以下错误:

Creating [dbo].[Correspondence]... Msg 1934, Level 16, State 1, Server (Server Name), Line 1 CREATE TABLE failed because the following SET options have incorrect settings : 'ANSI_WARNINGS, ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

任何人都可以解释这个错误给我,并帮我解决呢?这是数据库项目用来创建此表的脚本。

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 

回答

69

根据BOL

Indexed views and indexes on computed columns store results in the database for later reference. The stored results are valid only if all connections referring to the indexed view or indexed computed column can generate the same result set as the connection that created the index.

为了创建具有持久,计算列的表,下面的连接设置必须启用:

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 

但是,the SET options can also be set by the client application连接到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 

我会建议在创建表和相关索引之前,在脚本中调整这两个设置。

+1

谢谢,我已经能够使用您的文章,以得到这个工作。不幸的是,这比添加SET语句复杂一点,因为我们的脚本是使用Visual Studio数据库项目动态创建的,并且通常会从修改后的数据库中自动重新创建。还有一个错误会阻止在单个对象的属性中设置某些设置。更多的问题,但现在会建立。 – 2012-02-11 02:45:05

+2

这真的很有用。 无论如何,我不得不将NUMERIC_ROUNDABORT设置为OFF – gigi 2016-03-03 11:56:53

+1

NUMERIC_ROUNDABOUT应该是NUMERIC_ROUNDABORT,但是6个字符的编辑限制了我修复这个问题。 – Blackunknown 2016-03-08 15:33:21

2

我发现这个问题的解决方案:

  1. 转至服务器属性。
  2. 选择连接选项卡。
  3. 检查ansi_padding选项是否未选中。
+0

这些只是数据库默认值。设置通常由连接和/或SSMS本身覆盖。 – Suncat2000 2017-06-02 14:00:33

2

在我的情况下,我试图在MS SQL Server 2012上创建从一个数据库到另一个数据库的表。右键单击一个表,然后选择脚本表为>删除并创建>新查询编辑器窗口,以下脚本创建:

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 

但是上面的脚本执行,当它返回错误:

SELECT failed because the following SET options have incorrect settings: 'ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

我已经找到了解决办法:

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 

希望这HEL:在顶部的脚本这样的启用设置页。

+0

也有这个相同的问题。使用SSMS右键单击创建脚本,创建一个脚本,其中读取... SET ANSI_PADDING ON,CREATE MyTable,SET ANSI_PADDING OFF,ALTER TABLE索引。我不得不删除辅助SET ANSI_PADDING OFF来让我的脚本执行。以前从未见过。为什么SSMS以一种无法执行的方式编写脚本? – 2016-10-31 18:11:35

0

对我来说,只要将兼容性级别设置为更高级别即可。要看C.Level:

select compatibility_level from sys.databases where name = [your_database]