【问题标题】:Converting ntext to nvcharmax(max) - Getting around size limitation将 ntext 转换为 nvcharmax(max) - 绕过大小限制
【发布时间】:2011-06-10 03:46:09
【问题描述】:

我正在尝试将现有 SQL NText 列更改为 nvcharmax(max),但遇到大小限制错误。有大量的现有数据,我相信其中一些超过了 8k 的限制。

我们希望对其进行转换,以便在 LINQ 中可以搜索该字段。

我尝试过的 2x SQL 语句是:

update Table
set dataNVarChar = convert(nvarchar(max), dataNtext)
where dataNtext is not null

update Table
set dataNVarChar = cast(dataNtext as nvarchar(max))
where dataNtext is not null

我得到的错误是:

Cannot create a row of size 8086 which is greater than the allowable maximum row size of 8060.

这是使用 SQL Server 2008。

任何帮助表示赞赏, 谢谢。


更新/解决方案:

下面标记的答案是正确的,在我的情况下,SQL 2008 可以将列更改为正确的数据类型,并且我们在其上使用的 LINQ 应用程序没有任何戏剧性:

alter table [TBL] alter column [COL] nvarchar(max)

我还被建议跟进:

update [TBL] set [COL] = [COL]

通过将数据从 lob 结构移动到表中来完成转换(如果长度小于 8k),从而提高性能/保持正确。

【问题讨论】:

    标签: sql nvarchar


    【解决方案1】:

    这很可能是因为列 dataNVarChar 未定义为 NVARCHAR(max) 要将列从 NTEXT 转换为 NVARCHAR(MAX),请使用此

    alter table TBL alter column COL nvarchar(max)
    

    它会同时为你执行列中数据的转换

    【讨论】:

    • 为了澄清,dataNVarChar 列被指定为 NVarChar(MAX)。然而,我发现这发生在 SQL 2008 中,而不是 2008 R2...
    • 阅读此处stackoverflow.com/questions/1701808/… 概述 varchar(max) 列。这可能是 2008 年的一个错误,它试图内联存储数据,因为它在 2008 R2 中工作(并且应该在 2005 年)。如果可能的话,列类型 ALTER COLUMN 的冷迁移也可以工作,而不是第二列。
    • 这听起来确实是一个错误。如果定义为 max 的列会超出最大行大小,则应自动将其存储在行外。您可以使用以下命令明确告诉 SQL Server 将大数据类型存储在行外:EXEC sp_tableoption 'yourtablename', 'large value types out of row', 1;
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2021-11-12
    • 2015-08-08
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多