2

在 SQL 服务器数据库中,我有一个表,其中包含一个设置为允许 NULL 的 TEXT 字段。我需要将其更改为不允许 NULL。我可以通过企业管理器做到这一点,但是当我尝试运行以下脚本时,alter table dbo.[EventLog] Alter column [Message] text Not null,我得到一个错误:

无法更改列“ErrorMessage”,因为它是“文本”。

阅读 SQL 联机丛书确实表明您不允许在 TEXT 字段上执行 ALTER COLUMN。不过,我确实需要能够通过脚本来执行此操作,而不是在企业管理器中手动执行。那么在脚本中执行此操作的选项是什么?

4

6 回答 6

4

您可以使用企业管理器来创建您的脚本。右键单击 EM 中的表并选择设计。取消选中 Text 字段的 Allow Nulls 列。不要点击常规的保存图标(软盘),而是单击一个看起来像带有小软盘的金色卷轴的图标,或者只是从菜单中执行 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
于 2008-09-17T12:58:21.997 回答
2

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

于 2008-09-17T12:46:01.340 回答
1

我认为摆脱空值是最简单的。

(正如 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  
于 2008-09-17T13:10:24.247 回答
0

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

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

如果其他人对确切的 TSQL 语法有更好的把握来补充这个答案,请随意。

于 2008-09-17T12:47:35.520 回答
0

我将使用 NULL 值更新所有列并将其设置为空字符串,例如,''。然后您应该能够毫无问题地运行您的 ALTER TABLE 脚本。比创建新列要少得多。

于 2008-09-17T12:49:28.667 回答
0

尝试从企业管理器中生成更改脚本,看看它是如何在那里完成的

于 2008-09-17T12:51:30.580 回答