更改表时“无法创建大小为 8074 的行,该行大于允许的最大行大小 8060”

18 sql-server sql-server-2012

我正在尝试更改表中的列。现有的表是这样的:

CREATE TABLE [dbo].[table](
   [id1] [int] NOT NULL,
   [id2] [int] NOT NULL,
   [id3] [int] NOT NULL,
   [name] [nvarchar](255) NOT NULL,
   [id4] [int] NOT NULL,
   [xmlData] [xml](CONTENT [dbo].[xml_schema]) NULL,
   [booleanData1] [bit] NOT NULL,
   [notes] [varchar](4096) NULL,
   [id5] [int] NULL,
   [booleanData2] [bit] NULL,
   [id6] [int] NULL,

   CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED 
   ([id1] ASC, [id2] ASC, [id3] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

现在我试图在这个表上执行这个 sql:

ALTER TABLE [table] ALTER COLUMN [xmlData] XML
Run Code Online (Sandbox Code Playgroud)

这样我就可以删除 xml 模式并用新的模式替换它。

但我收到此错误:

无法创建大于允许的最大行大小 8060 的大小为 8074 的行。

谁能告诉我这里有什么问题?

Pau*_*ite 26

如果您之前删除或修改了此表上的列,则可能需要回收空间才能成功执行此操作。SQL Server 并不总是/通常会立即为删除或更改的列回收空间。

如果之前的操作都是对可变长度列的删除(或更改),那么发布DBCC CLEANTABLE应该就足够了。否则,您将需要重建表。您可以通过重建聚集索引来做到这一点:

ALTER INDEX PK_table
ON dbo.table
REBUILD 
WITH (ONLINE = ON); -- Enterprise only, optional
Run Code Online (Sandbox Code Playgroud)