我需要圍繞下面的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
當我拿出GOs時,我得到一個有關modifiedDate的錯誤。你的意思是? 「如果我拿出GOs,它會抱怨_modifiedDate_是無效的列。」 – 2012-03-19 15:32:15
TMP_FIELD是無效的列。 – Rod 2012-03-19 15:49:54
我想我在測試時以不同的方式定義了表MY_TABLE。我沒有在表格模式中包含列修改數據。我一開始並沒有仔細閱讀這個例子,所以我沒有理解你正在使用的原始表的模式。 – 2012-03-19 15:55:56