【问题标题】:Running an alter table alter column statement more than once in SQL Server在 SQL Server 中多次运行 alter table alter column 语句
【发布时间】:2016-11-28 19:03:53
【问题描述】:

在 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 之间的处理方式是否存在差异?

谢谢, 伊利亚斯

【问题讨论】:

  • 你试过了吗?发生什么了?此外,您可以事先检查您的列是否存在,或检查其他属性并有条件地执行更改语句。
  • 我想不出有什么不同。您的语句必须是自包含在它们自己的 BATCH 中(即GO 语句)。例如,尝试添加一列并在同一批次中引用它。它会出错。
  • @Jeremy 我已经尝试过并按预期工作,我已经编辑了这个问题,希望能说清楚。谢谢。

标签: sql-server


【解决方案1】:

这是一个仅限元数据的操作。

它不必读取或写入属于Table1 的任何数据页。不过,这并不是完全没有操作。

它仍然会启动一个事务,获取表的模式修改锁并更新sys.sysschobjs中该表的行中的modified列(通过sys.objects中的modified_date列向我们公开)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2013-11-26
    • 2014-04-17
    相关资源
    最近更新 更多