2010-04-08 119 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

相关问题