如何在不删除的情况下更改列 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 长度的主要内容,如果未能解决你的问题,请参考以下文章
如何在不删除适配器的情况下更新数据集以反映数据源中添加的列?
如何在不使用临时表或视图的情况下在多个列上使用 PIVOT [重复]
如何在不转换列的情况下更改 MySQL 中的表(默认)排序规则[重复]