Sql server sql 2005-nvarchar(最大)-无法创建大于允许的最大值8060的大小为8064的行
当我将table alter column从nvarchar(4000)更改为nvarchar(max)时,出现此错误: 无法创建大于允许的最大值8060的大小为8064的行 我已经看过了类似的问题,但我仍然无法解释为什么这不起作用 我还尝试将alter语句替换为add列并更新: 之前:Sql server sql 2005-nvarchar(最大)-无法创建大于允许的最大值8060的大小为8064的行,sql-server,sql-server-2005,Sql Server,Sql Server 2005,当我将table alter column从nvarchar(4000)更改为nvarchar(max)时,出现此错误: 无法创建大于允许的最大值8060的大小为8064的行 我已经看过了类似的问题,但我仍然无法解释为什么这不起作用 我还尝试将alter语句替换为add列并更新: 之前: alter table myTable alter column myColumn nvarchar(max) 之后: exec sp_rename 'dbo.myTable.myColumn', 'my
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
但我还是犯了同样的错误
如何更新此列以及此处发生的情况?添加新列可能需要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
表中其他列的整体是什么?@Mitchel-int(4)、char(1)、varchar(92)、char(36)、datetime(8)、int(4)、nvarchar(-1)、int(4)、nvarchar(4000)。最后一个是不会转换的。奇怪的是,你会注意到另一个nvarchar(-1)将okJust转换为test,你能将nvarchar转换为ntext吗?@stealthyninja-谢谢你的输入,但这是一个相当大的表,一旦我完成了更新,我就必须恢复才能返回。如果你能告诉我这会有什么帮助或者它会证明什么,我肯定会测试这个。这对于更新来说是有意义的,但是对于alter来说,你是说sql server通过类似的添加和删除过程来执行alter列吗?@Chris Simpson:所有行都包含空位图。因此,添加一个
null
列不会占用任何空间,但是将该列更新为包含行外数据的字符串可能需要额外的字节。对不起,我当时可能不清楚。如果我有一个nvarchar(4000)并将其更改为nvarchar(max),sql会创建一个新列吗?@Chris Simpson:看起来更改一个列是通过添加一个列,将旧列转换为新列,然后删除旧列来实现的