2010-04-08 114 views
0

我正在編寫腳本來更新數據庫以添加Filestream功能。該腳本需要能夠多次運行而不會出錯。這是我目前有即使IF語句爲false,Alter Table Filestream也會運行

IF ((select count(*) from sys.columns a 
     inner join sys.objects b on a.object_id = b.object_id 
     inner join sys.default_constraints c on c.parent_object_id = a.object_id 
     where a.name = 'evidence_data' and b.name='evidence' 
      and c.name='DF__evidence_evidence_data') = 0) 

begin 

ALTER TABLE evidence SET (FILESTREAM_ON = AnalysisFSGroup) 
ALTER TABLE evidence ALTER COLUMN id ADD ROWGUIDCOL; 

end 

GO 

我第一次對數據庫運行這個工作正常。第二次if語句應該爲false時,會拋出一個錯誤,指出「由於表'evidence'已經有FILESTREAM文件組或分區方案,因此無法添加FILESTREAM文件組或分區方案。」如果我把一個簡單的選擇放入if語句並在線取出alter table filestream,它就會正常工作,並且不會執行if語句。所以實際上,即使if語句爲false,它總是在語句上運行alter table filestream。

任何想法或建議都會很棒。謝謝。

+0

你確定你得到了所有的名字拼寫的IF是否正確?如果其中任何一個都是錯誤的,那麼它總是會執行ALTER(我特別懷疑DF__約束名) – RBarryYoung 2010-04-08 20:35:06

+0

是的,我確定如果我在IF語句中運行select本身,它返回正確的結果1.謝謝。 – Allison 2010-04-09 12:45:04

回答

0

很難在不知道細節的情況下推理您的業務邏輯,但是我想說如果您只想更改沒有定義文件流數據空間的表,請考慮基於以下查詢的條件(如果它返回NULL給定表,這意味着FILESTREAM數據空間(文件組或分區方案)沒有定義:

select filestream_data_space_id from sys.tables

+0

我試過這個,但仍然有同樣的問題。無論sql是true還是false,它都會運行alter語句並失敗。如果我在查詢中放置了一個簡單的選擇,它就會正確運行,但只要我將alter語句放入它中,就無法嘗試運行alter語句。 – Allison 2010-04-16 19:33:23

+0

所以 IF(從[分析]。[SYS] [filestream_data_space_id] [表]其中name = '證據')IS NULL 開始 SELECT * FROM analysis.dbo.evidence 結束 這確實只是這 IF(SELECT [filestream_data_space_id] FROM [analysis]。[sys]。[tables] where name ='evidence')IS NULL begin ALTER TABLE evidence SET(FILESTREAM_ON = AnalysisFSGroup) end 錯誤並且說文件流已經打開。 – Allison 2010-04-16 19:45:45

相關問題