Не может создать строку размера 8074, который больше, чем допустимый максимальный размер строки 8 060

Я уже задал вопрос об этом, но проблемы продолжают поражать меня ;-)

У меня есть две таблицы, которые идентичны. Я хочу добавить xml столбец. В первой таблице это не проблема, но во второй таблице я получаю sqlException (заголовок). Однако кроме данных в нем, они - то же. Так, я могу получить sqlException из-за данных в таблице?

Я также попытался сохранить поле от страницы с

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

но без любого успеха. Тот же SqlException продолжает приезжать.

Первая таблица: 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]

Вторая таблица: 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]

Первый скрипт, который я пытался запустить (Сначала два ALTER TABLE хорошо работают, третьи катастрофические отказы на SqlException),

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

Второй сценарий я пытался работать с тем же результатом как предыдущий сценарий:

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

Теперь, В PackageSessionNodes существует 234 записи, в PackageSessionNodesFinished существует 4 256 946 записей.

Действительно ценил бы некоторую справку здесь, поскольку я застреваю.

5
задан Lieven Cardoen 26 January 2010 в 12:41
поделиться

3 ответа

Попробуйте сначала опорожить свой стол, сделайте свои изменения, затем снова поставьте данные. Похоже, что есть ряд, который хранит свои существующие данные в строке, и добавление нового столбца находится только за его предел. Если вы возьмете данные, сделайте изменение, а затем снова надевайте его, он должен хранить вместо этого xml вне строки.

К сожалению, он не будет перемещать данные из строки, когда вы делаете этот тип, если изменение. Это очень редкая ситуация, ты не повезла.

Редактировать: Кроме того, вы можете попробовать восстановить свой кластерный индекс после установки параметра таблицы, чтобы весь XML был вынужден вне строки. Вы также можете сделать немного математики и некоторые расчетные длины строки, чтобы работать, какие строки (ы) вызывают проблему. Тогда вы можете временно перемещать эти данные.

3
ответ дан 13 December 2019 в 05:35
поделиться

Это до данных. Если вы должны были добавить этот столбец к пустую таблицу, или на самом деле для вашей первой таблицы, вы получите предупреждение о том, что это может привести к превышению максимальной строки, и что это может вызвать вставки или Обновления, чтобы провалиться. В случае вашей второй таблицы, по меньшей мере, один ряд уже находится в состоянии, где это имеет значение, и поэтому он является добавлением столбца, который не удается. Предупреждения там по причине и должны редко, если когда-либо будут проигнорированы.

Так что да, вы можете получить это из-за данных в таблице.

3
ответ дан 13 December 2019 в 05:35
поделиться

К вашему сведению, выполнение этой команды SQL в вашей БД может решить проблему, если она вызвана пространством, которое необходимо освободить после удаления столбцов переменной длины:

DBCC CLEANTABLE (0,[dbo.TableName])

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

3
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: