sql-server - 构建数据库项目时出现“不正确的 SET 选项”错误

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

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

我刚刚进行了一些数据库更改(包括添加一个名为 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

最佳答案

根据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

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

关于sql-server - 构建数据库项目时出现“不正确的 SET 选项”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9235527/

相关文章:

sql-server - 数据库项目未运行部署后脚本

visual-studio-2012 - 默认为 Visual Studio 2012 数据库项目中的 T-SQL Pane View

sql - 如何知道 SSIS 在哪一行无法解析平面文件中的数据

database-project - 使用GenerateDropsIfNotInProject部署数据库项目会删除数据库项目中的用户

mysql - 如果存在则更新否则插入mysql

sql-server - SQL Server 2012 加密

sql-server - XML 数据类型方法 "query"的参数 1 必须是字符串文字

sql - 将数据类型从一个数据库表转换为另一个数据库表

asp.net - SQL Server : How to select multiple columns with 1 column being distinct?

sql - TSQL游标自动对货币类型变量进行舍入