2012-03-19 58 views
0

我需要圍繞下面的SQL腳本與if語句檢查一個表的存在。聲明中有很多字段,但下面的代碼片段應該足以實現這個想法。SQL腳本,如果和去聲明

如果我用if語句包圍整個批處理,它不會像我在if語句之間有GO。如果我拿出GO,它會抱怨TMP_FIELD是一個無效的列。

有什麼方法可以正確地做到這一點?我正在做的是採取一堆字段,並從varchar更改爲datetime。這是setup.exe文件的一部分,所以我只需要它運行一次,而不是將來的升級。我確定的方式是,如果某個表存在,則不要運行該腳本。

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD TMP_FIELD datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET TMP_FIELD = modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD modifiedDate datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET modifiedDate = TMP_FIELD 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN TMP_FIELD 
GO 
+0

當我拿出GOs時,我得到一個有關modifiedDate的錯誤。你的意思是? 「如果我拿出GOs,它會抱怨_modifiedDate_是無效的列。」 – 2012-03-19 15:32:15

+0

TMP_FIELD是無效的列。 – Rod 2012-03-19 15:49:54

+0

我想我在測試時以不同的方式定義了表MY_TABLE。我沒有在表格模式中包含列修改數據。我一開始並沒有仔細閱讀這個例子,所以我沒有理解你正在使用的原始表的模式。 – 2012-03-19 15:55:56

回答

1

你真的不需要爲改變列的類型而做所有的體操活動嗎?

create table MY_TABLE (
    modifiedDate varchar(20) 
) 
go 

insert MY_TABLE (modifiedDate) values ('2012-10-20 17:50:41') 
go 

select * from MY_TABLE 
go 

alter table MY_TABLE alter column modifiedDate datetime 
go 

select * from MY_TABLE 
go 

drop table MY_TABLE 
go 

所以,我會寫你的說法是這樣的:

​​
0

的GOS標記一批TSQL語句的結束。在同一批次中,不能將DDL(數據定義語言)語句(如ALTER TABLE)與DML(數據操作語言)語句(如UPDATE TABLE)混合使用。

每批都是自己編譯的。因此,當ALTER TABLE和UPDATE TABLE語句在同一批次中時,SQL Server無法編譯更新語句,因爲列modifiedData尚未實際創建。

+0

那麼你如何在一組批次中添加條件? – Rod 2012-03-19 16:32:42

0

如果你想解決'Invalid column ..'錯誤,一個選擇是使用動態SQL。 例如:

create table dbo.t1 (id int primary key, cola varchar(20)) 
go 

insert dbo.t1 values (1, 'one') 
insert dbo.t1 values (2, 'two') 
go 

if not exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 't1' and COLUMN_NAME = 'colb') 
BEGIN 
    -- add new column 'colb', and set its value initially to existing values in 'cola' 
    ALTER TABLE dbo.t1 ADD colb varchar(20) 

    DECLARE @v NVARCHAR(500) 
    SET @v = N'UPDATE dbo.t1 SET colb = cola' 
    EXEC (@v) -- use dynamic SQL, otherwise will get Invalid column name colb error.  
END 
GO 

請注意,動態SQL應被視爲最後的手段。大衛布拉班特的答案似乎是解決原始問題的方法。