web-dev-qa-db-ja.com

データベースプロジェクトのビルド時の「不正なSETオプション」エラー

Visual Studioとデータベースプロジェクトを使用して、データベースを生成しています。

いくつかのデータベースの変更(Correspondenceという名前の新しいテーブルの追加を含む)を行って、それらの変更をデータベースプロジェクトにインポートし、データベースをデプロイ(再構築)しようとしました。

すると、次のエラーが表示されます。

[dbo]。[Correspondence] ...メッセージ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
34
Jonathan Wood

[〜#〜] 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になっています。これが、投稿したエラーを最初に複製できなかった理由の1つです。

とにかく、エラーを複製するには、これを試してください(これは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

テーブルと関連するインデックスを作成する前に、スクリプトでこれら2つの設定を調整することをお勧めします。

80
8kb

この問題の解決策を見つけました。

  1. サーバーのプロパティに移動します。
  2. 接続タブを選択します。
  3. ansi_paddingオプションがオフになっているかどうかを確認します。
2
sanath Kumar s

私の場合、MS SQL Server 2012で1つのデータベースから別のデータベースにテーブルを作成しようとしていました。テーブルを右クリックして、スクリプトテーブル> 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

ただし、上記のスクリプトを実行すると、エラーが返されました。

次のSETオプションの設定が正しくないため、SELECTが失敗しました: '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

この助けを願っています。

2
Ivan Santiago

私にとっては、互換性レベルをより高いレベルに設定するだけでうまくいきます。 C.Levelを表示するには:

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

私の場合、計算列がインデックスの「含まれている列」に追加されていることがわかりました。その後、そのテーブル内のアイテムが更新されたときに、mergeステートメントはそのメッセージで失敗しました。マージはトリガーであったため、これを追跡するのは困難でした!計算列をインデックスから削除すると修正されました。

0
Glen Little

フィルター選択されたインデックスでも同じ問題が発生し、挿入と更新が失敗しました。私がやったことは、insertステートメントとupdateステートメントを持つストアドプロシージャを次のように変更することだけでした。

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
0
Amruta Kar