如何在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不是用于更改多列的单个语句,但是,它使生活变得简单:
-
生成一个表的
CREATE
脚本。 -
用第一行的
ALTER TABLE [TableName] ALTER COLUMN
replaceCREATE TABLE
-
从列表中删除不需要的列。
-
根据需要更改列数据types。
-
执行查找并replace…如下所示:
- 查找:
NULL
, - replace为:
NULL; ALTER TABLE [TableName] ALTER COLUMN
NULL; ALTER TABLE [TableName] ALTER COLUMN
- 点击更换button。
- 查找:
-
运行脚本。
希望它会节省很多时间:))
正如其他人所回答的,您需要多个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) )