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

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

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)

当前回答

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

在这里查看ALTER TABLE语法

您可以执行多个ADD或多个DROP COLUMN,但只能执行一个ALTER 列。

其他回答

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

在这里查看ALTER TABLE语法

您可以执行多个ADD或多个DROP COLUMN,但只能执行一个ALTER 列。

多亏了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'

如果你不想自己写整个东西,把所有的列都改成相同的数据类型,这可以让它更容易:

select 'alter table tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);'
from syscolumns where id = object_id('tblcommodityOHLC ')

您可以复制和粘贴输出作为您的查询

这是不可能的。你需要一个一个地做。 你可以:

创建一个临时表,其中包含已修改的列 复制数据 删除原来的表(请仔细检查!) 将临时表重命名为原来的名称

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

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