2016-11-28 129 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列此表。

此外,由於表已被修改,任何引用表的執行計劃將需要在下次使用時重新編譯。