Часто я хочу сделать обратное тому, что вы просите. Например, если пользователь настроил процедуру, и я не хочу потерять их изменения, но я хочу применить единый сценарий обновления для всех моих клиентов, я бы хотел сделать что-то вроде следующего:
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
create proc myProc
as begin
-- proc stmts here
end
go
Эта логика позволила бы мне создавать что-либо, только если этого не существует, но, к моему большому разочарованию, SQL Server также предотвращает это.
Я достаточно легко обхожусь с этой проблемой следующим образом:
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
exec('create proc myProc
as begin
-- proc stmts here
declare @object int = 0
end')
go
Передав команду create proc в виде строки и поместив ее в выражение exec, мы обойдем глупое правило, которое вообще не позволяет делать это.