5 Stimmen

Es kann keine Zeile der Größe 8074 erstellt werden, die größer ist als die zulässige maximale Zeilengröße von 8060

Ich habe bereits eine Frage dazu gestellt, aber die Probleme schlagen immer wieder auf mich ein ;-)

Ich habe zwei Tabellen, die identisch sind. Ich möchte eine xml-Spalte hinzufügen. In der ersten Tabelle ist das kein Problem, aber in der zweiten Tabelle bekomme ich die sqlException (title). Abgesehen von den darin enthaltenen Daten sind sie jedoch identisch. Kann ich also die sqlException wegen der Daten in der Tabelle bekommen?

Ich habe auch versucht, das Feld außerhalb der Seite zu speichern mit

EXEC sp_tableoption 'dbo.PackageSessionNodesFinished', 
  'large value types out of row', 1

aber ohne jeden Erfolg. Es kommt immer wieder die gleiche SqlException.

Erster Tisch: PackageSessionNodes

CREATE TABLE [dbo].[PackageSessionNodes](
    [PackageSessionNodeId] [int] IDENTITY(1,1) NOT NULL,
    [PackageSessionId] [int] NOT NULL,
    [TreeNodeId] [int] NOT NULL,
    [Duration] [int] NULL,
    [Score] [float] NOT NULL,
    [ScoreMax] [float] NOT NULL,
    [Interactions] [xml] NOT NULL,
    [BrainTeaser] [bit] NULL,
    [DateCreated] [datetime] NULL,
    [CompletionStatus] [int] NOT NULL,
    [ReducedScore] [float] NOT NULL,
    [ReducedScoreMax] [float] NOT NULL,
    [ContentInteractions] [xml] NOT NULL,
 CONSTRAINT [PK_PackageSessionNodes] PRIMARY KEY CLUSTERED 
(
    [PackageSessionNodeId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Zweiter Tisch: PackageSessionNodesFinished

CREATE TABLE [dbo].[PackageSessionNodesFinished](
    [PackageSessionNodeFinishedId] [int] IDENTITY(1,1) NOT NULL,
    [PackageSessionId] [int] NOT NULL,
    [TreeNodeId] [int] NOT NULL,
    [Duration] [int] NULL,
    [Score] [float] NOT NULL,
    [ScoreMax] [float] NOT NULL,
    [Interactions] [xml] NOT NULL,
    [BrainTeaser] [bit] NULL,
    [DateCreated] [datetime] NULL,
    [CompletionStatus] [int] NOT NULL,
    [ReducedScore] [float] NOT NULL,
    [ReducedScoreMax] [float] NOT NULL,
    [ContentInteractions] [xml] NULL,
 CONSTRAINT [PK_PackageSessionNodesFinished] PRIMARY KEY CLUSTERED 
(
    [PackageSessionNodeFinishedId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Das erste Skript, das ich versucht habe, auszuführen (die ersten beiden ALTER TABLE funktionieren gut, das dritte stürzt bei SqlException ab)

ALTER TABLE dbo.PackageSessionNodes ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodes_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodes
    DROP CONSTRAINT DF_PackageSessionNodes_ContentInteractions

ALTER TABLE dbo.PackageSessionNodesFinished ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodesFinished_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodesFinished
    DROP CONSTRAINT DF_PackageSessionNodesFinished_ContentInteractions

Das zweite Skript, das ich auszuführen versuchte, führte zum gleichen Ergebnis wie das vorherige Skript:

EXEC sp_tableoption 'dbo.PackageSessionNodes', 
    'large value types out of row', 1

ALTER TABLE dbo.PackageSessionNodes ADD
    ContentInteractions xml NOT NULL CONSTRAINT
    DF_PackageSessionNodes_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodes
    DROP CONSTRAINT DF_PackageSessionNodes_ContentInteractions

EXEC sp_tableoption 'dbo.PackageSessionNodesFinished', 
    'large value types out of row', 1

ALTER TABLE dbo.PackageSessionNodesFinished ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodesFinished_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodesFinished
    DROP CONSTRAINT DF_PackageSessionNodesFinished_ContentInteractions

In PackageSessionNodes gibt es 234 Datensätze, in PackageSessionNodesFinished gibt es 4256946 Datensätze.

Ich wäre wirklich dankbar für Hilfe, da ich nicht weiterkomme.

3voto

David M Punkte 69725

Es kommt auf die Daten an. Wenn Sie diese Spalte zu einer leeren Tabelle oder sogar zu Ihrer ersten Tabelle hinzufügen würden, würden Sie eine Warnung erhalten, dass diese Mai dazu führen, dass die maximale Zeilengröße den Grenzwert überschreitet, und dass dies dazu führen kann, dass Einfügungen oder Aktualisierungen fehlschlagen. Im Fall Ihrer zweiten Tabelle befindet sich mindestens eine Zeile bereits in dem Zustand, in dem dies der Fall ist, und daher schlägt das Hinzufügen der Spalte fehl. Warnungen sind aus einem bestimmten Grund da und sollten selten bis nie ignoriert werden.

Also ja, Sie können dies aufgrund der Daten in der Tabelle erhalten.

3voto

Rob Farley Punkte 15180

Versuchen Sie, Ihre Tabelle zunächst zu leeren, Ihre Änderungen vorzunehmen und die Daten dann wieder einzugeben. Es hört sich so an, als gäbe es eine Zeile, die ihre bestehenden Daten in der Zeile speichert, und das Hinzufügen der neuen Spalte übersteigt gerade ihr Limit. Wenn Sie die Daten herausnehmen, die Änderung vornehmen und sie dann wieder einfügen, sollte die xml-Datei stattdessen außerhalb der Zeile gespeichert werden.

Leider werden bei dieser Art von Änderung keine Daten aus einer Zeile verschoben. Das ist eine sehr seltene Situation, da haben Sie Pech gehabt.

Bearbeiten: Sie könnten auch versuchen, Ihren geclusterten Index neu zu erstellen, nachdem Sie die Tabellenoption festgelegt haben, so dass alle XML aus der Zeile erzwungen werden. Sie könnten auch etwas Mathematik betreiben und die Zeilenlängen berechnen, um herauszufinden, welche Zeile(n) das Problem verursachen. Dann könnten Sie diese Daten vorübergehend verschieben.

3voto

Kevin Albrecht Punkte 6904

Zu Ihrer Information: Wenn Sie diesen SQL-Befehl auf Ihrer DB ausführen, kann das Problem behoben werden, wenn es durch Speicherplatz verursacht wird, der nach dem Löschen von Spalten mit variabler Länge wiedergewonnen werden muss:

DBCC CLEANTABLE (0,[dbo.TableName])

Siehe: http://msdn.microsoft.com/en-us/library/ms174418.aspx

3voto

Marlon Bernardes Punkte 12197

Neben dem Laufen DBCC CLEANTABLE Außerdem musste ich die Tabelle mit den folgenden Befehlen neu erstellen.

DBCC CLEANTABLE (TheNameOfYourDB, 'TableName', 0);
ALTER TABLE TableName REBUILD;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X