Я уже задал вопрос об этом, но проблемы продолжают поражать меня ;-)
У меня есть две таблицы, которые идентичны. Я хочу добавить 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 записей.
Действительно ценил бы некоторую справку здесь, поскольку я застреваю.
Попробуйте сначала опорожить свой стол, сделайте свои изменения, затем снова поставьте данные. Похоже, что есть ряд, который хранит свои существующие данные в строке, и добавление нового столбца находится только за его предел. Если вы возьмете данные, сделайте изменение, а затем снова надевайте его, он должен хранить вместо этого xml вне строки.
К сожалению, он не будет перемещать данные из строки, когда вы делаете этот тип, если изменение. Это очень редкая ситуация, ты не повезла.
Редактировать: Кроме того, вы можете попробовать восстановить свой кластерный индекс после установки параметра таблицы, чтобы весь XML был вынужден вне строки. Вы также можете сделать немного математики и некоторые расчетные длины строки, чтобы работать, какие строки (ы) вызывают проблему. Тогда вы можете временно перемещать эти данные.
Это до данных. Если вы должны были добавить этот столбец к пустую таблицу, или на самом деле для вашей первой таблицы, вы получите предупреждение о том, что это может привести к превышению максимальной строки, и что это может вызвать вставки или Обновления, чтобы провалиться. В случае вашей второй таблицы, по меньшей мере, один ряд уже находится в состоянии, где это имеет значение, и поэтому он является добавлением столбца, который не удается. Предупреждения там по причине и должны редко, если когда-либо будут проигнорированы.
Так что да, вы можете получить это из-за данных в таблице.
К вашему сведению, выполнение этой команды SQL в вашей БД может решить проблему, если она вызвана пространством, которое необходимо освободить после удаления столбцов переменной длины:
DBCC CLEANTABLE (0,[dbo.TableName])