我需要更改表中几个列的数据类型。

对于单个列,下面的工作很好:

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)

当前回答

下面的解决方案不是一个单独的语句来修改多个列,但是,是的,它使生活变得简单:

生成一个表的CREATE脚本。 第一行用ALTER TABLE [TableName] ALTER COLUMN替换CREATE TABLE 从列表中删除不需要的列。 根据需要更改列数据类型。 执行Find and Replace…,如下所示: 发现:空, 替换为:NULL;修改表的列 点击替换按钮。 运行脚本。

希望能节省很多时间:)

其他回答

多亏了Evan的代码示例,我能够对其进行更多的修改,使其更特定于以特定列名开头的表,并处理约束的细节。我运行该代码,然后复制[code]列并毫无问题地执行它。

USE [Table_Name]
GO
SELECT
     TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,COLUMN_NAME
    ,DATA_TYPE
    ,'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] DROP CONSTRAINT [DEFAULT_'+TABLE_NAME+'_'+COLUMN_NAME+']; 
ALTER TABLE  ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] datetime2 (7) NOT NULL 
ALTER TABLE  ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ADD CONSTRAINT [DEFAULT_'+TABLE_NAME+'_'+COLUMN_NAME+'] DEFAULT (''3/6/2018 6:47:23 PM'') FOR ['+COLUMN_NAME+']; 
GO' AS '[CODE]'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'form_%' AND TABLE_SCHEMA = 'dbo'
 AND (COLUMN_NAME = 'FormInserted' OR COLUMN_NAME = 'FormUpdated')
 AND DATA_TYPE = 'datetime'

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

如果希望将表中的全部或部分列修改为相同的数据类型(例如将VARCHAR字段从50个字符扩展到100个字符),可以使用下面的查询自动生成所有语句。如果您想在多个字段中替换相同的字符(例如从所有列中删除\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语句。

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

查询:

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

我们可以像这样在一个查询中修改多个列:

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语句。 试一试:

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