如何在SQL Server中一次更改多个列

我需要ALTER表中几列的数据types。

对于单列,以下工作正常:

 ALTER TABLE tblcommodityOHLC ALTER COLUMN CC_CommodityContractID NUMERIC(18,0) 

但是,如何在一个语句中更改多个列? 以下不起作用:

 ALTER TABLE tblcommodityOHLC ALTER COLUMN CC_CommodityContractID NUMERIC(18,0), CM_CommodityID NUMERIC(18,0) 

这不可能。 你将需要一个一个的做。

您可以创build一个临时表,其中包含已修改的列,复制数据,放弃原始表并将临时表重命名为原始名称。

在单个ALTER TABLE语句中执行多个ALTER COLUMN操作是不可能的。

请看这里的ALTER TABLE语法:
http://msdn.microsoft.com/en-US/library/ms190273.aspx

你可以做多个ADD或多个DROP COLUMN,但只有一个ALTER COLUMN。

以下解决scheme不是用于更改多列的单个语句,但是,它使生活变得简单:

  1. 生成一个表的CREATE脚本。

  2. 用第一行的ALTER TABLE [TableName] ALTER COLUMNreplaceCREATE TABLE

  3. 从列表中删除不需要的列。

  4. 根据需要更改列数据types。

  5. 执行查找并replace…如下所示:

    1. 查找: NULL
    2. replace为: NULL; ALTER TABLE [TableName] ALTER COLUMN NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. 点击更换button。
  6. 运行脚本。

希望它会节省很多时间:))

正如其他人所回答的,您需要多个ALTER TABLE语句。 尝试:

 ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0); ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0); 

等等

如果您在management studio中进行了更改并生成脚本,则会创build一个新表并将旧数据插入到具有更改的数据types的表中。 这是更改两列数据types的一个小例子

 /* 12 August 201008:30:39 User: Server: CLPPRGRTEL01\TELSQLEXPRESS Database: Tracker_3 Application: */ /* 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 ALTER TABLE dbo.tblDiary DROP CONSTRAINT FK_tblDiary_tblDiary_events GO ALTER TABLE dbo.tblDiary_events SET (LOCK_ESCALATION = TABLE) GO COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_tblDiary ( Diary_ID int NOT NULL IDENTITY (1, 1), Date date NOT NULL, Diary_event_type_ID int NOT NULL, Notes varchar(MAX) NULL, Expected_call_volumes real NULL, Expected_duration real NULL, Skill_affected smallint NULL ) ON T3_Data_2 TEXTIMAGE_ON T3_Data_2 GO ALTER TABLE dbo.Tmp_tblDiary SET (LOCK_ESCALATION = TABLE) GO SET IDENTITY_INSERT dbo.Tmp_tblDiary ON GO IF EXISTS(SELECT * FROM dbo.tblDiary) EXEC('INSERT INTO dbo.Tmp_tblDiary (Diary_ID, Date, Diary_event_type_ID, Notes, Expected_call_volumes, Expected_duration, Skill_affected) SELECT Diary_ID, Date, Diary_event_type_ID, CONVERT(varchar(MAX), Notes), Expected_call_volumes, Expected_duration, CONVERT(smallint, Skill_affected) FROM dbo.tblDiary WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_tblDiary OFF GO DROP TABLE dbo.tblDiary GO EXECUTE sp_rename N'dbo.Tmp_tblDiary', N'tblDiary', 'OBJECT' GO ALTER TABLE dbo.tblDiary ADD CONSTRAINT PK_tblDiary PRIMARY KEY NONCLUSTERED ( Diary_ID ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO CREATE UNIQUE CLUSTERED INDEX tblDiary_ID ON dbo.tblDiary ( Diary_ID ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO CREATE NONCLUSTERED INDEX tblDiary_date ON dbo.tblDiary ( Date ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO ALTER TABLE dbo.tblDiary WITH NOCHECK ADD CONSTRAINT FK_tblDiary_tblDiary_events FOREIGN KEY ( Diary_event_type_ID ) REFERENCES dbo.tblDiary_events ( Diary_event_ID ) ON UPDATE CASCADE ON DELETE CASCADE GO COMMIT 

正如很多其他人所说,您将需要使用多个ALTER COLUMN语句,每个列要修改。

如果要将表中的全部或部分列修改为相同的数据types(例如将VARCHAR字段从50扩展到100个字符),则可以使用以下查询自动生成所有语句。 如果要replace多个字段中的相同字符(如从所有列中删除\ t),此技术也很有用。

 SELECT TABLE_CATALOG ,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAME ,'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] VARCHAR(300)' as 'code' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'your_table' AND TABLE_SCHEMA = 'your_schema' 

这将为您为每个列生成一个ALTER TABLE语句。

 select 'ALTER TABLE ' + OBJECT_NAME(o.object_id) + ' ALTER COLUMN ' + c.name + ' DATETIME2 ' + CASE WHEN c.is_nullable = 0 THEN 'NOT NULL' ELSE 'NULL' END from sys.objects o inner join sys.columns c on o.object_id = c.object_id inner join sys.types t on c.system_type_id = t.system_type_id where o.type='U' and c.name = 'Timestamp' and t.name = 'datetime' order by OBJECT_NAME(o.object_id) 

礼貌devio

我们可以像这样在单个查询中改变多个列
ALTER TABLE tblcommodityOHLC CHANGE COLUMN updated_on updated_on DATETIME NULL DEFAULT NULL AFTER updated_by
CHANGE COLUMN delivery_datetime delivery_datetime DATETIME NULL DEFAULT CURRENT_TIMESTAMP after delivery_status ;

用逗号分隔查询

如果我正确理解你的问题,你可以通过使用下面提到的查询添加多个列在表中。

查询:

 Alter table tablename add (column1 dataype, column2 datatype); 

– 创build临时表CREATE TABLE temp_table_alter(column_name varchar(255)
);

– 将这些coulmns插入临时表中,以便改变列的大小

 INSERT INTO temp_table_alter (column_name) VALUES ('colm1'); INSERT INTO temp_table_alter (column_name) VALUES ('colm2'); INSERT INTO temp_table_alter (column_name) VALUES ('colm3'); INSERT INTO temp_table_alter (column_name) VALUES ('colm4'); DECLARE @col_name_var varchar(255); DECLARE alter_table_cursor CURSOR FOR select column_name from temp_table_alter ; OPEN alter_table_cursor FETCH NEXT FROM alter_table_cursor INTO @col_name_var WHILE @@FETCH_STATUS = 0 BEGIN PRINT('ALTER COLUMN ' + @col_name_var); EXEC ('ALTER TABLE Original-table ALTER COLUMN ['+ @col_name_var + '] DECIMAL(11,2);') FETCH NEXT FROM alter_table_cursor INTO @col_name_var END CLOSE alter_table_cursor 

DEALLOCATE alter_table_cursor

– 结束drop temp table drop table temp_table_alter;

ALTER COLUMN语句放在一个括号内,它应该工作。

 ALTER TABLE tblcommodityOHLC alter ( column CC_CommodityContractID NUMERIC(18,0), CM_CommodityID NUMERIC(18,0) )