在SQL Server数据库中,我有一个表,其中包含一个TEXT字段,该字段设置为允许NULL。我需要将其更改为不允许NULL。我可以通过企业管理器来解决这个问题,但是当我尝试运行以下脚本时, alter table dbo。[EventLog]更改列[Message] text not null ,我收到错误:
无法更改列'ErrorMessage',因为它是'text'。
阅读SQL Books Online确实显示您不允许在TEXT字段上执行ALTER COLUMN。我确实需要能够通过脚本执行此操作,而不是在Enterprise Manager中手动执行此操作。那么在脚本中执行此操作的选项是什么?
答案 0 :(得分:4)
您可以使用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
答案 1 :(得分:2)
创建一个新字段。复制数据。放下旧场。重命名新字段。
答案 2 :(得分: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
答案 3 :(得分:0)
在我的脑海中,我要说你需要创建一个与现有表具有相同结构的新表,但是将text列设置为not null然后运行查询以将记录从一个移到另一个。
我意识到这是一种伪代码,但我认为这是你唯一的选择。
如果对精确TSQL语法有更好控制力的其他人关心补充这个答案,请随意。
答案 4 :(得分:0)
我会使用NULL值更新所有列并将其设置为空字符串,例如''。然后,您应该能够毫无问题地运行ALTER TABLE脚本。比创建新列少得多的工作。
答案 5 :(得分:0)
尝试从Enterprise Manager中生成更改脚本以查看它是如何在那里完成的