如何在不删除的情况下更改列 nvarchar 长度

Posted

技术标签:

【中文标题】如何在不删除的情况下更改列 nvarchar 长度【英文标题】:How to alter column nvarchar length without drop 【发布时间】:2017-08-23 16:55:38 【问题描述】:

我正在尝试像这样更改表“Post”中“Body”列的长度:

ALTER TABLE Post ALTER COLUMN Body nvarchar(8000) NOT NULL;

该列被定义为 nvarchar(4000),它给了我这个错误:

消息 2717,第 16 级,状态 2,第 1 行 赋予参数“Body”的大小 (8000) 超过了允许的最大值 (4000)。

【问题讨论】:

尝试使用使用 nvarchar(max) 您无法创建 NVARCHAR(8000)。如果 NVARCHAR 数据类型需要超过 4,000 个字符,则需要使用 NVARCHAR(max)。 nvarchar(max) 工作 【参考方案1】:

改用 Max。如果该列被声明为 VARCHAR,8000 就可以了。

ALTER TABLE Post ALTER COLUMN Body nvarchar(max) NOT NULL;

【讨论】:

从 nvarchar(4000) 更改为 nvarchar(MAX) 不是仅元数据操作;每一行都会更新。 @Jurion 这是一个非常广泛的主张,根据我的经验是没有根据的。我期待您的证据来支持您的主张【参考方案2】:

如果列有任何约束键,如默认值,请检查.. ext,首先我们从列中删除键约束,而不是更改列的大小并更改对列的约束。以下步骤将对您有所帮助。

步骤是,

>  ALTER TABLE MESSAGE_INBOX_VIEWERS DROP CONSTRAINT DF_CONST_TEXT
>  ALTER TABLE MESSAGE_INBOX_VIEWERS ALTER COLUMN TEXT NVARCHAR(MAX) 
>  ALTER TABLE MESSAGE_INBOX_VIEWERS ADD CONSTRAINT DF_CONST_TEXT DEFAULT('') FOR TEXT

【讨论】:

【参考方案3】:

对于约束,您可以使用以下

DECLARE @DEFCONSTRAINT VARCHAR(1000);
DECLARE @DropDFConstraitCmd  VARCHAR(1000);
DECLARE @AlterDFColumnCmd VARCHAR(1000);
DECLARE @CreateDFConstraitCmd VARCHAR(1000);
DECLARE @CONSTRAINT_SAYI NUMERIC;
SET @DEFCONSTRAINT=(SELECT name
                      FROM sys.sysobjects
                     WHERE type = 'D' AND OBJECT_NAME(parent_obj) = 'TABLENAME' and name like 'DF__TABLENAME__COLUMNNAME%');
SET @CONSTRAINT_SAYI=(SELECT count(*)
                      FROM sys.sysobjects
                     WHERE type = 'D' AND OBJECT_NAME(parent_obj) = 'TABLENAME' and name like 'DF__TABLENAME__COLUMNNAME%');
SET @DropDFConstraitCmd   = ' ALTER TABLE TABLENAME DROP CONSTRAINT ' +@DEFCONSTRAINT;
SET @AlterDFColumnCmd     = ' ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME nvarchar(max) NOT NULL';
SET @CreateDFConstraitCmd = ' ALTER TABLE TABLENAME ADD CONSTRAINT ' +@DEFCONSTRAINT + ' DEFAULT ('' '') FOR COLUMNNAME ';
if @CONSTRAINT_SAYI > 0
    exec (@DropDFConstraitCmd);
exec (@AlterDFColumnCmd);
exec (@CreateDFConstraitCmd);

【讨论】:

【参考方案4】:

尝试使用 NTEXT。

ALTER TABLE Post ALTER COLUMN Body NTEXT NOT NULL;

NTEXT 与 NVARCHAR 类似,但更多用于需要大量文本的 BODY 字段或注释字段。

【讨论】:

以上是关于如何在不删除的情况下更改列 nvarchar 长度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中更改现有表的列长度?

如何在不删除适配器的情况下更新数据集以反映数据源中添加的列?

如何在不使用临时表或视图的情况下在多个列上使用 PIVOT [重复]

如何在不转换列的情况下更改 MySQL 中的表(默认)排序规则[重复]

Spring Boot & Hibernate:没有@Type 注释的 NVARCHAR 列类型

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?