Alter Table Filestream выполняется, даже если оператор IF равен false - PullRequest
0 голосов
/ 09 апреля 2010

Я пишу скрипт для обновления базы данных, чтобы добавить возможность 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 должно быть ложным, выдается сообщение об ошибке: «Невозможно добавить файловую группу FILESTREAM или схему секционирования, поскольку таблица« доказательства »уже имеет файловую группу FILESTREAM или схему секционирования». Если я вставлю простой оператор выбора в оператор if и вытащу поток файлов alter table в строку, он будет работать правильно и не выполнит оператор if. Таким образом, по сути, он всегда запускает оператор потока файлов таблицы alter, даже если оператор if равен false.

Любые мысли или предложения будут великолепны. Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2010

Трудно рассуждать о вашей бизнес-логике, не зная деталей, но я бы сказал, что если вы хотите изменить только таблицы, для которых не определено пространство данных файлового потока, рассмотрите условие на основе следующего запроса (если он возвращает NULL для данной таблицы, это означает, что пространство данных файлового потока (файловая группа или схема разбиения) не определено:

select filestream_data_space_id from sys.tables

...