Попробуйте следующее. Следует избегать привязки плана хранимой процедуры к значению параметра, переданного во время первого выполнения хранимой процедуры (подробности см. Анализ параметров SQL Server ):
create proc dbo.foo
@TaskControl varchar(32)
as
declare @selection varchar(32)
set @selection = @TaskControl
select *
from dbo.Orders t
join dbo.Task t1 on t1.id = t.id
where @selection = 'Table1'
UNION ALL
select *
from dbo.Orders t
join dbo.Task_subset t1 on t1.id = t.id
where @selection = 'Table2'
return 0
go
Хранимая процедура не должна перекомпилироваться для каждого вызова, как и предполагал @Martin, но значение 1-го переданного параметра не должно влиять на план выполнения, к которому привязывается. Но если производительность является проблемой, запустите трассировку sql с профилировщиком и посмотрите, используется ли кэшированный план выполнения повторно или инициирована перекомпиляция.
Тем не менее, одна вещь: вам необходимо убедиться, что каждый отдельный select
в UNION
возвращает точно такие же столбцы. Каждый select
в UNION
должен иметь одинаковое количество столбцов, и каждый столбец должен иметь общий тип (или преобразование по умолчанию в общий тип). 1-й select
определяет количество, типы и имена столбцов в наборе результатов.