【问题标题】:'Incorrect SET Options' Error When Building Database Project构建数据库项目时出现“不正确的 SET 选项”错误
【发布时间】:2012-03-03 09:06:36
【问题描述】:

我们正在使用 Visual Studio 和一个数据库项目来生成我们的数据库。

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

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

正在创建 [dbo].[通信]... 消息 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

【问题讨论】:

    标签: sql-server sql-server-2008 database-project


    【解决方案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
    

    但是,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
    

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

    【讨论】:

    • 谢谢,我已经能够使用您的帖子来完成这项工作。不幸的是,它比仅仅添加 SET 语句要复杂一些,因为我们的脚本是使用 Visual Studio 数据库项目动态创建的,并且经常从修改后的数据库中自动重新创建。还有一个错误会阻止在单个对象的属性中设置其中一些设置。更多问题,但它现在会构建。
    • 这真的很有用。无论如何,就我而言,我必须将 NUMERIC_ROUNDABORT 设置为 OFF
    • NUMERIC_ROUNDABOUT 应该是 NUMERIC_ROUNDABORT,但是 6 个字符的编辑限制了我修复这个问题。
    【解决方案2】:

    我找到了解决这个问题的方法:

    1. 转到服务器属性。
    2. 选择连接标签。
    3. 检查 ansi_padding 选项是否未选中。

    【讨论】:

    • 这些只是数据库默认值。设置通常被连接和/或 SSMS 本身覆盖。
    【解决方案3】:

    在我的例子中,我试图在 MS SQL Server 2012 上创建一个从一个数据库到另一个数据库的表。右键单击一个表并选择 Script Table as > DROP And CREATE To > New Query Editor Window,创建了以下脚本:

    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 失败,因为以下 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
    

    希望对您有所帮助。

    【讨论】:

    • 也有同样的问题。使用 SSMS 右键单击​​创建脚本,制作一个脚本,内容为... SET ANSI_PADDING ON, CREATE MyTable, SET ANSI_PADDING OFF, ALTER TABLE 索引。我必须删除辅助的 SET ANSI_PADDING OFF 才能执行我的脚本。以前从未见过。为什么 SSMS 以无法执行的方式编写脚本?
    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 2011-11-02
        • 1970-01-01
        • 2019-01-27
        • 2019-08-18
        相关资源
        最近更新 更多