2008-09-17 77 views
2

在SQL服务器数据库中,我有一个包含TEXT字段的表,该字段被设置为允许NULL。我需要改变这个不允许NULL。我可以通过企业管理器做这没有问题,但是当我尝试运行下面的脚本,ALTER TABLE DBO [事件日志]改变列[消息]文本不是空,我得到一个错误:如何更改SQL Server中数据库表上的TEXT列?

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

阅读网上图书SQL确实揭示你不允许做文本字段的ALTER COLUMN。我真的需要能够通过脚本完成此操作,而不是在Enterprise Manager中手动完成。那么在脚本中做这个选项有什么选择呢?

回答

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 
2

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

0

关闭我的头顶,我说你需要创建一个新的表具有相同的结构现有的表,但与你的文本列设置为不为空,然后运行一个查询到的记录从一个移动到另一个。

我知道这是不大不小的伪代码的答案,但我认为这是真的,你已经得到了唯一的选择。

如果别人用确切的TSQL语法护理更好的抓地力,以补充这个答案,感觉很自由。

0

我将更新所有NULL值的列,并将其设置为空字符串,例如,“”。那么你应该可以毫无问题地运行你的ALTER TABLE脚本。比创建新列少得多。

0

尝试从企业管理器中生成更改脚本,看看它是如何做有

1

我认为摆脱空值是easist。

(如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 
相关问题