如何更改SQL Server中数据库表上的TEXT列?
时间:2020-03-05 18:58:44 来源:igfitidea点击:
在SQL Server数据库中,我有一个表,其中包含一个TEXT字段,该字段设置为允许NULL。我需要更改它以不允许NULL。我可以通过企业管理器来做到这一点,但是当我尝试运行以下脚本时,请更改表dbo。
无法更改列" ErrorMessage",因为它是"文本"。
确实,在线阅读SQL Books确实表明,我们不允许在TEXT字段上执行ALTER COLUMN。我确实确实需要能够通过脚本来做到这一点,而不是在企业管理器中手动进行。那么在脚本中有哪些选择呢?
解决方案
回答
创建一个新字段。复制数据。放下旧字段。重命名新字段。
回答
我想说的是,我们需要创建一个新表,该表的结构与现有表相同,但text列设置为非null,然后运行查询以将记录从一个移到另一个。
我意识到这是一个伪代码答案,但我认为那确实是我们唯一的选择。
如果其他人对确切的TSQL语法有更好的掌握,可以补充此答案,请放心。
回答
我将使用NULL值更新所有列,并将其设置为空字符串,例如"''。然后,我们应该能够毫无问题地运行ALTER TABLE脚本。比创建新列要少得多的工作。
回答
尝试从企业管理器中生成更改脚本,以了解如何完成更改
回答
我们可以使用企业管理器来创建脚本。右键单击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
回答
我认为摆脱null值很容易。
(如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