2017-08-16 65 views
1

我有一個表與現有數據的成員,我想添加一個名爲'IsOnlineUser'的非空值位列,我希望所有現有行都設置爲false。我有一組每個I部署時運行的腳本,所以我需要一個檢查,看看錶如何編寫更新以添加具有現有值的列

我嘗試的第一個SQL是

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser'); 

IF (@ColumnExists = 0) 
BEGIN 
    ALTER TABLE Member ADD IsOnlineUser bit NULL; 

    UPDATE Member SET IsOnlineUser= 0; 
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
END 
GO 

但是,這給了我

無效列名'IsOnlineUser'

。 Assumedly這是因爲更新未能找到創建的列,所以我想如果我把一個「GO」這兩種說法之間,這將有助於所以我做了以下內容:

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser'); 

IF (@ColumnExists = 0) 
BEGIN 
    ALTER TABLE Member ADD IsOnlineUser bit NULL; 

END 
GO 

IF (@ColumnExists = 0) 
BEGIN 
    UPDATE Member SET IsOnlineUser= 0; 
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
END 
GO 

然而,這說

必須聲明標量變量「@ColumnExists」。

假設這是因爲GO阻止我訪問兩者之間的標量變量。

這似乎是一個很常見的情況,所以我想我只是失去了一些東西,任何幫助將不勝感激

+0

你不需要設置@ columnExists =(...)在去之後再次? https://stackoverflow.com/questions/937336/is-there-a-way-to-persist-a-variable-across-a-go因爲變量不會一直持續下去嗎? – xQbert

+0

DECLARE @ColumnExists INT –

回答

2

你可以爲not null用默認約束添加列:

alter table Member add IsOnlineUser bit not null default 0; 

或者,你可以給約束一個特定的名稱在同一時間,像這樣:

alter table member 
    add IsOnlineUser bit not null 
    constraint df_Member_IsOnlineUser default 0; 

爲了簡化if,你跳過變量和使用not exists()像這樣:

if not exists (
    select 1 
    from information_schema.columns 
    where table_name = 'Member' 
    and column_name = 'IsOnlineUser' 
) 
begin; 
alter table member 
    add IsOnlineUser bit not null 
    constraint df_Member_IsOnlineUser default 0; 
end; 

如果你只是想使現有的代碼工作,同時保持當前的邏輯,你可以執行SQL字符串,而不是內嵌代碼execsp_executesql

... 
if (@ColumnExists = 0) 
begin; 
    exec sp_executesql N'alter table Member add IsOnlineUser bit null'; 
    exec sp_executesql N'update Member set IsOnlineUser= 0;'; 
    exec sp_executesql N'alter table Member alter column IsOnlineUser bit not null;'; 
end; 
go 
0

您可以檢查列是否不存在,如果需要添加它。把GO放在那裏,然後進入UPDATE和ALTER。無論哪個列存在或不存在,它都能正確運行。不需要變量。

IF NOT EXISTS (SELECT * FROM sys.columns WHERE name = 'IsOnlineUser' AND object_id = OBJECT_ID('Member')) 
ALTER TABLE Member ADD IsOnlineUser bit NULL; 
GO 
UPDATE Member SET IsOnlineUser= 0; 
ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
GO 

注:我更喜歡使用SQL Server的SYS意見,而不是ANSI INFORMATION.SCHEMA,並想表明的選擇,但是這只是我。如果你喜歡,你可以保留INFORMATION.SCHEMA。

編輯PS:變量只存在於一個批次中。在你使用GO之後,你不能使用在之前聲明的變量。

相關問題