2011-12-10 33 views
2

如何編寫我的SQL腳本以確保新列在創建後的後續行中可見。如何在SQL腳本中創建新列之後立即引用新列

這是我的SQL的一般形式:

BEGIN TRANSACTION 

    if (not exists(select 1 from THIS_TABLE)) 
     BEGIN 
     ALTER TABLE THIS_TABLE add THIS_COLUMN int 
     END 
COMMIT 

BEGIN TRANSACTION 

    IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE 
      WHERE THIS_COLUMN = 1)) 
    BEGIN 
      UPDATE THIS_TABLE SET THIS_COLUMN = 1 
    END 

COMMIT 

這是我得到的錯誤:在此行

Invalid column name 'THIS_COLUMN'. 

 IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE 
      WHERE THIS_COLUMN = 1)) 

回答

7

列有在使用它的查詢之前被創建可以被解析。

alter table t1 add c1 int 
go 
update t1 set c1 = 1 

或通過運行第二個交易動態SQL:您可以通過將update在不同的批次,採用「走出去」的關鍵字做到這一點

alter table t1 add c1 int 
exec ('update t1 set c1 = 1') 
1

Andomar說的是正確的,您需要使用go關鍵字。 但是,最大的問題是你的邏輯看起來不對。讓我去通過每個用例:

如果THIS_TABLE不爲空

如果表不爲空,下方if返回false,你絕不會添加新列。

if (not exists(select 1 from THIS_TABLE)) 
      BEGIN 
      ALTER TABLE THIS_TABLE add THIS_COLUMN int 
      END 

之後,下一個腳本顯然失敗了,因爲沒有這樣的列THIS_COLUMN

IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE 
      WHERE THIS_COLUMN = 1)) 

如果THIS_TABLE是空

如果表是空的,列被添加:

if (not exists(select 1 from THIS_TABLE)) 
      BEGIN 
      ALTER TABLE THIS_TABLE add THIS_COLUMN int 
      END 

但是隨後下一個if將始終爲真,並且更新語句將影響零行(因爲表是空的)。

IF (NOT EXISTS (SELECT 1 FROM THIS_TABLE 
      WHERE THIS_COLUMN = 1)) 
BEGIN 
     UPDATE THIS_TABLE SET THIS_COLUMN = 1 
END 
相關問題