【问题标题】:How to alter column nvarchar length without drop如何在不删除的情况下更改列 nvarchar 长度
【发布时间】: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) 工作

标签: sql sql-server ssms


【解决方案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 字段或注释字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多