代码之家  ›  专栏  ›  技术社区  ›  Tim C

如何在SQL Server中更改数据库表的文本列?

  •  2
  • Tim C  · 技术社区  · 16 年前

    在SQL Server数据库中,我有一个表,其中包含一个设置为允许空值的文本字段。我需要将此更改为不允许空值。我可以通过Enterprise Manager做到这一点,但当我尝试运行以下脚本时, alter table dbo.[eventlog]alter column[message]文本不为空 ,我得到一个错误:

    无法更改列“errormessage”,因为它是“text”。

    联机阅读SQL书籍确实表明您不允许对文本字段执行alter列。不过,我真的需要能够通过脚本来完成这项工作,而不是在EnterpriseManager中手动完成。那么在脚本中有什么选择呢?

    6 回复  |  直到 16 年前
        1
  •  4
  •   Sixto Saez    16 年前

    可以使用Enterprise Manager创建脚本。右键单击em中的表并选择“设计”。取消选中文本字段的“允许空值”列。不要点击常规的保存图标(软盘),而是点击一个看起来像带有小软盘的金色卷轴的图标,或者点击菜单中的“表格设计器”>“生成更改脚本”。将脚本保存到一个文件中,以便重新使用。下面是一个脚本示例:

        /* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
    BEGIN TRANSACTION
    SET QUOTED_IDENTIFIER ON
    SET ARITHABORT ON
    SET NUMERIC_ROUNDABORT OFF
    SET CONCAT_NULL_YIELDS_NULL ON
    SET ANSI_NULLS ON
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    COMMIT
    BEGIN TRANSACTION
    GO
    CREATE TABLE dbo.Tmp_TestTable
        (
        tableKey int NOT NULL,
        Description varchar(50) NOT NULL,
        TextData text NOT NULL
        )  ON [PRIMARY]
         TEXTIMAGE_ON [PRIMARY]
    GO
    IF EXISTS(SELECT * FROM dbo.TestTable)
         EXEC('INSERT INTO dbo.Tmp_TestTable (tableKey, Description, TextData)
            SELECT tableKey, Description, TextData FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
    GO
    DROP TABLE dbo.TestTable
    GO
    EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
    GO
    ALTER TABLE dbo.TestTable ADD CONSTRAINT
        PK_TestTable PRIMARY KEY CLUSTERED 
        (
        tableKey
        ) ON [PRIMARY]
    
    GO
    COMMIT
    
        2
  •  2
  •   Seb Rose    16 年前

    创建新字段。复制数据。放下旧田地。重命名新字段。

        3
  •  1
  •   cheeves    16 年前

    我认为去掉空值是最容易的。

    (如Raz0rf1sh所说)

    CREATE TABLE tmp1( col1 INT identity ( 1, 1 ),   col2 TEXT )    
    GO  
    
    INSERT  
    INTO     tmp1  
    SELECT   NULL   
    
    GO 10  
    
    SELECT   *  
    FROM     tmp1  
    
    UPDATE tmp1  
    SET      col2  = ''  
    WHERE    col2 IS NULL  
    
    ALTER TABLE tmp1   
    ALTER COLUMN col2 TEXT NOT NULL  
    
    SELECT   *
    FROM     tmp1  
    
    DROP TABLE tmp1  
    
        4
  •  0
  •   Onorio Catenacci    16 年前

    我想说,您需要创建一个新表,该表的结构与现有表相同,但文本列设置为非空,然后运行查询将记录从一个表移动到另一个表。

    我知道这是一个伪代码答案,但我认为这是你唯一的选择。

    如果其他人能更好地掌握准确的TSQL语法,那么请注意补充这个答案。

        5
  •  0
  •   mattruma    16 年前

    我将用空值更新所有列,并将其设置为空字符串,例如,“”。然后,您应该能够运行alter-table脚本而不会出现任何问题。比创建一个新列要少得多。

        6
  •  0
  •   Amr ElGarhy    16 年前

    尝试在Enterprise Manager中生成更改脚本,以查看在该脚本中如何执行更改。