it-swarm.com.de

Fehler 'falsche SET-Optionen' beim Erstellen des Datenbankprojekts

Wir verwenden Visual Studio und ein Datenbankprojekt, um unsere Datenbank zu generieren.

Ich habe gerade eine Reihe von Datenbankänderungen vorgenommen (einschließlich dem Hinzufügen einer neuen Tabelle mit dem Namen Correspondence), importierte diese Änderungen in das Datenbankprojekt und versuchte, die Datenbank bereitzustellen (neu zu erstellen).

Wenn ich dies tue, erhalte ich folgende Fehlermeldung:

Erstellen von [dbo]. [Korrespondenz] ... Meldung 1934, Ebene 16, Status 1, Server (Servername), Zeile 1 CREATE TABLE ist fehlgeschlagen, da die folgenden SET-Optionen falsche Einstellungen haben : "ANSI_WARNINGS, ANSI_PADDING". Stellen Sie sicher, dass die SET-Optionen für die Verwendung korrekt sind mit indizierten Ansichten und/oder Indizes für berechnete Spalten und/oder gefilterte Indizes und/oder Abfragebenachrichtigungen und/oder XML-Datentypmethoden und/oder räumlichen Index Operationen.

Kann mir jemand diesen Fehler erklären und mir helfen, ihn zu lösen? Hier ist das Skript, mit dem das Datenbankprojekt diese Tabelle erstellt.

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
33
Jonathan Wood

Nach BOL

Indizierte Sichten und Indizes für berechnete Spalten speichern Ergebnisse in der Datenbank für spätere Referenz. Die gespeicherten Ergebnisse sind nur gültig, wenn alle Verbindungen, die sich auf die indizierte Sicht oder die indizierte berechnete Spalte beziehen kann dieselbe Ergebnismenge erzeugen wie die Verbindung, mit der die .__ erstellt wurde. Index.

Um eine Tabelle mit einer persistenten berechneten Spalte zu erstellen, müssen die folgenden Verbindungseinstellungen aktiviert sein: 

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

Diese Werte werden auf Datenbankebene festgelegt und können angezeigt werden mit: 

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

Die SET-Optionen können auch von der Clientanwendung festgelegt werden Verbindung mit SQL Server.

Ein perfektes Beispiel ist SQL Server Management Studio, das die Standardwerte für SET ANSI_NULLS und SET QUOTED_IDENTIFIER beide auf ON hat. Dies ist einer der Gründe, warum ich den von Ihnen geposteten Fehler zunächst nicht kopieren konnte. 

Versuchen Sie Folgendes, um den Fehler zu duplizieren (dies überschreibt die SSMS-Standardeinstellungen): 

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
) 

Sie können den obigen Testfall beheben, indem Sie Folgendes verwenden: 

SET ANSI_PADDING ON
SET ANSI_WARNINGS ON

Ich würde empfehlen, diese beiden Einstellungen in Ihrem Skript anzupassen, bevor Sie die Tabelle und die zugehörigen Indizes erstellen.

77
8kb

Ich habe die Lösung für dieses Problem gefunden:

  1. Gehen Sie zu den Servereigenschaften.
  2. Wählen Sie die Registerkarte Verbindungen.
  3. Prüfen Sie, ob die Option ansi_padding nicht markiert ist.
2
sanath Kumar s

In meinem Fall habe ich versucht, eine Tabelle von einer Datenbank in eine andere auf MS SQL Server 2012 zu erstellen. Klicken Sie mit der rechten Maustaste auf eine Tabelle und wählen Sie Script Table als> DROP AND CREATE To> New Query Editor Window aus erstellt:

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

Bei der Ausführung des obigen Skripts wurde jedoch der Fehler zurückgegeben:

SELECT schlug fehl, da die folgenden SET-Optionen falsch sind Einstellungen: 'ANSI_PADDING'. Stellen Sie sicher, dass die SET-Optionen für die Verwendung korrekt sind mit indizierten Ansichten und/oder Indizes für berechnete Spalten und/oder gefiltert Indizes und/oder Abfragebenachrichtigungen und/oder XML-Datentypmethoden und/oder räumliche Indexoperationen.

Die Lösung, die ich gefunden habe: Aktivieren der Einstellungen oben im Skript wie folgt:

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

Ich hoffe das hilft.

2
Ivan Santiago

Für mich funktioniert das Einstellen der Kompatibilitätsstufe auf ein höheres Niveau gut. Zu sehen C.Level:

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

In meinem Fall stellte ich fest, dass eine berechnete Spalte zu den "eingeschlossenen Spalten" eines Index hinzugefügt wurde. Später, als ein Element in dieser Tabelle aktualisiert wurde, schlug die Anweisung merge mit dieser Nachricht fehl. Die Zusammenführung hatte einen Auslöser, so dass es schwierig war, dies aufzuspüren! Das Entfernen der berechneten Spalte aus dem Index hat das Problem behoben.

0
Glen Little

Ich hatte das gleiche Problem mit dem gefilterten Index und meine Einfügungen und Aktualisierungen schlugen fehl. Ich habe lediglich die gespeicherte Prozedur geändert, die die Anweisung insert und update enthielt, und zwar in:

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