Невозможно создать строку размером 8074, которая превышает максимально допустимый размер строки 8060 - PullRequest
5 голосов
/ 26 января 2010

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

У меня есть две таблицы, которые идентичны. Я хочу добавить столбец XML. В первой таблице это не проблема, но во второй таблице я получаю sqlException (title). Однако, кроме данных в нем, они одинаковы. Итак, я могу получить 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 есть 4256946 записей.

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

Ответы [ 4 ]

3 голосов
/ 17 сентября 2014

Помимо запуска DBCC CLEANTABLE Мне также пришлось перестроить таблицу, используя команды ниже

DBCC CLEANTABLE (TheNameOfYourDB, 'TableName', 0);
ALTER TABLE TableName REBUILD;
3 голосов
/ 26 января 2010

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

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

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

3 голосов
/ 30 марта 2010

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

DBCC CLEANTABLE (0,[dbo.TableName])

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

3 голосов
/ 26 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...