2016-11-28 218 views
2

在SQL Server中多次运行alter table alter column语句是否有负面影响?在SQL Server中多次运行alter table alter column语句

说我改变列的数据类型和为空这样的:

--create table 
create table Table1 
(
    Column1 varchar(50) not null 
) 
go 

--insert some records 
insert into Table1 values('a') 
insert into Table1 values('b') 
go 

--alter once 
alter table Table1 
    alter column Column1 nvarchar(250) not null 
go 

--alter twice 
alter table Table1 
    alter column Column1 nvarchar(250) not null 
go 

以上组SQL所有的作品,我已经测试了这些。我也可以测试alter语句中的属性。问题是,在修改之前检查列是否已经是空的,是否有优势?

第一次更改后,SQL Server是否发现表已经被修改,因此第二个修改本质上什么都不做?

不同版本的SQL Server之间有关于如何处理的任何差异?

谢谢, 伊利亚斯

+2

你试过了吗?怎么了?此外,您可以先检查您的列是否存在,或者检查其他属性并有条件地执行alter语句。 – Jeremy

+1

我想不出有什么不同。您的语句在自己的BATCH中是独立的,因为它必须是(即'GO'语句)。例如,尝试添加一列并在同一批次中引用它。它会出错。 – scsimon

+0

@Jeremy我已经试过并按预期工作,我已经编辑了这个问题,希望能够说清楚。谢谢。 – ilias

回答

1

这是一个元数据仅操作。

它不必读取或写入属于Table1的任何数据页面。尽管如此,它并不是一个完全没有用的东西。

它仍然会启动一个事务,获取表上的架构修改锁和sys.sysschobjs(通过modified_datesys.objects暴露给我们)更新的行中的modified列此表。

此外,由于表已被修改,任何引用表的执行计划将需要在下次使用时重新编译。