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

Sql server 如何在SQL server中更改数据库表上的文本列?,sql-server,tsql,Sql Server,Tsql,在SQL server数据库中,我有一个表,其中包含一个文本字段,该字段设置为允许空值。我需要将此更改为不允许空值。我可以通过Enterprise Manager执行此操作,但当我尝试运行以下脚本时,alter table dbo。[EventLog]alter column[Message]text Not null,我得到一个错误: 无法更改列“ErrorMessage”,因为它是“text” 在线阅读SQL书籍确实表明,您不允许对文本字段执行ALTER列。不过,我确实需要能够通过脚本完成这

在SQL server数据库中,我有一个表,其中包含一个文本字段,该字段设置为允许空值。我需要将此更改为不允许空值。我可以通过Enterprise Manager执行此操作,但当我尝试运行以下脚本时,alter table dbo。[EventLog]alter column[Message]text Not null,我得到一个错误:

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


在线阅读SQL书籍确实表明,您不允许对文本字段执行ALTER列。不过,我确实需要能够通过脚本完成这项工作,而不是在Enterprise Manager中手动完成。那么,在脚本中执行此操作的选项是什么?

创建一个新字段。将数据复制到整个数据库。放弃旧的领域。重命名新字段。

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

我意识到这是一种伪代码答案,但我认为这是你唯一的选择


如果对确切的TSQL语法掌握得更好的其他人愿意补充这个答案,请放心

我会用空值更新所有列,并将其设置为空字符串,例如“”。然后您应该能够毫无问题地运行altertable脚本。与创建新列相比,所做的工作要少得多。

尝试从Enterprise Manager中生成更改脚本,以了解如何在那里完成更改。

您可以使用Enterprise Manager创建脚本。在EM中的表格上单击鼠标右键,然后选择“设计”。取消选中文本字段的“允许为空”列。不要点击常规的保存图标(软盘),而是单击一个看起来像金色卷轴的图标,上面有一个小软盘,或者只需从菜单中执行Table Designer>Generate Change Script(表格设计器>生成更改脚本)。将脚本保存到文件中,以便可以重用它。下面是一个示例脚本:

    /* 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

我认为消除空值是最简单的方法

(正如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