【问题标题】:sql 2005 - nvarchar(max) - Cannot create a row of size 8064 which is greater than the allowable maximum of 8060sql 2005 - nvarchar(max) - 无法创建大小为 8064 的行,该行大于允许的最大值 8060
【发布时间】:2010-11-15 21:48:44
【问题描述】:

当我将 table alter 列从 nvarchar(4000) 更改为 nvarchar(max) 时出现此错误:

无法创建大于允许的最大值 8060 的大小为 8064 的行

我已经查看了类似的问题,但我仍然无法解释为什么这不起作用

Converting nvarchar(4000) to nvarchar(max)

Cannot create a row of size 8064 which is greater than the allowable row size of 8060

我也尝试将 alter 语句替换为添加列并更新:

之前:

alter table myTable alter column myColumn nvarchar(max)

之后:

exec sp_rename 'dbo.myTable.myColumn', 'myColumn_old', 'COLUMN'
GO
alter table myTable add myColumn nvarchar(max)
GO 
update myTable set myColumn = myColumn_old

但我仍然遇到同样的错误。

如何更新此专栏以及这里发生了什么?

【问题讨论】:

  • 表格与其他列的整体边是什么?
  • @Mitchel - int (4), char (1), varchar (92), char (36), datetime (8), int (4), nvarchar (-1), int (4 ), nvarchar (4000) 最后一个是不会转换的。奇怪的是,您会注意到另一个转换为 ok 的 nvarchar(-1)
  • 只是为了测试,能不能把nvarchar转成ntext?
  • @stealthyninja - 感谢您的输入,但这是一个非常大的表,一旦我完成了更新,我必须恢复才能返回。如果您能告诉我这可能有什么帮助或可能证明什么,我肯定会对此进行测试。

标签: sql-server sql-server-2005


【解决方案1】:

可能是新列的添加需要4个字节。它是一个nvarchar(max),因此它的大部分数据将存储在行外,但它仍然需要 4 个字节来声明它的存在。

您可以查看最大的行:

select top 10 * from myTable order by len(myColumn_old) desc

看看你能不能砍掉几个字节。另一种选择是创建一个完全只包含nvarchar(max) 列的新表,然后将数据复制过来:

insert into NewTable (col1, col2, ...) select col1, col2, ... from OldTable

【讨论】:

  • 这对于更新是有道理的,但是对于更改,您是说 sql server 通过类似的添加和删除过程来执行更改列吗?
  • @Chris Simpson:所有行都包含一个空位图。因此,添加 null 列可以不占用空间,但是将该列更新为包含行外数据的字符串可能需要额外的字节。
  • 对不起,我当时可能不太清楚。如果我有一个 nvarchar(4000) 并将其更改为 nvarchar(max),sql 是否会创建一个新列?
  • @Chris Simpson:看起来改变一列是通过添加一列,将旧列转换为新列,然后删除旧列来实现的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多