【问题标题】:Changing columns from Nvarchar(max) to Nvarchar(4000) error将列从 Nvarchar(max) 更改为 Nvarchar(4000) 错误
【发布时间】:2021-06-26 13:35:10
【问题描述】:

我正在将列从 NVARCHAR(MAX) 更改为 NVARCHAR(4000),该列不需要是 MAX,并且 4000 个字符应该足以容纳该列,因此为了提高性能,我将列变小。

我认为这很容易:

alter table [MyTable]
alter column [Description] nvarchar(4000) NULL

但是这给了我错误:

赋予参数“描述”的大小 (8000) 超过 允许的最大值 (4000)。

我不明白这个错误消息.. 我没有指定8000,我什至没有超过4000 允许的最大值

那么这里发生了什么?

编辑

表/列上的某些列可以使用NVARCHAR(4000),而其他.. 则不行,使用数字 4000,错误似乎表明我可以在特定列上指定的最大值是 NVARCHAR(2000)

【问题讨论】:

  • 如果你有任何数据,你在描述栏中的字符的最大长度是多少
  • 您确定这实际上是您正在运行的代码吗?你有任何 DDL 触发器吗?
  • 该列中数据的最大长度为305.. 可能存在 DDL 触发器.. 让我检查一下
  • 我不认为将声明的长度从max缩短到4000有任何性能改进。
  • @user1 。 . .我很确定适合数据页的字符串存储在数据页上,其他页面仅在必要时使用(这里是一些时序sqlshack.com/…)。无论如何,这似乎是一种微优化,即使它确实对桌子产生了影响。

标签: sql sql-server alter-table nvarchar


【解决方案1】:

结果是其中一位 cmets 建议的 DDL 触发器。

这些 DDL 触发器由第三方提供,用于将数据同步到客户端,所以我不能 100% 确定这些触发器中发生了什么,但我想他们计算错误并认为最大值是nvarchar(2000) 而不是 nvarchar(4000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多