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
[〜#〜] 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つの設定を調整することをお勧めします。
この問題の解決策を見つけました。
私の場合、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
この助けを願っています。
私にとっては、互換性レベルをより高いレベルに設定するだけでうまくいきます。 C.Levelを表示するには:
select compatibility_level from sys.databases where name = [your_database]
私の場合、計算列がインデックスの「含まれている列」に追加されていることがわかりました。その後、そのテーブル内のアイテムが更新されたときに、merge
ステートメントはそのメッセージで失敗しました。マージはトリガーであったため、これを追跡するのは困難でした!計算列をインデックスから削除すると修正されました。
フィルター選択されたインデックスでも同じ問題が発生し、挿入と更新が失敗しました。私がやったことは、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