Они обычно перекомпилируются автоматически. Я думаю, я не знаю, гарантировано ли это, но это было то, что я наблюдал - если вы измените (например, добавите индекс) объекты, на которые ссылается sproc, то он перекомпилирует.
create table mytable (i int identity)
insert mytable default values
go 100
create proc sp1 as select * from mytable where i = 17
go
exec sp1
Если вы посмотрите на план для этого выполнения, он показывает сканирование таблицы, как и ожидалось.
create index mytablei on mytable(i)
exec sp1
План изменился на поиск индекса.
РЕДАКТИРОВАТЬ: хорошо, я пришел с запросом, который, кажется, работает - это дает вам все имена sproc, которые имеют ссылку на данную таблицу в кэше плана. Вы можете объединить имя sproc с синтаксисом sp_recompile, чтобы сгенерировать кучу операторов sp_recompile, которые затем можно выполнить.
;WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
,TableRefs (SProcName, ReferencedTableName) as
(
select
object_name(qp.objectid) as SProcName,
objNodes.objNode.value('@Database', 'sysname') + '.' + objNodes.objNode.value('@Schema', 'sysname') + '.' + objNodes.objNode.value('@Table', 'sysname') as ReferencedTableName
from sys.dm_exec_cached_plans cp
outer apply sys.dm_exec_sql_text(cp.plan_handle) st
outer apply sys.dm_exec_query_plan(cp.plan_handle) as qp
outer apply qp.query_plan.nodes('//Object[@Table]') as objNodes(objNode)
where cp.cacheobjtype = 'Compiled Plan'
and cp.objtype = 'Proc'
)
select
*
from TableRefs
where SProcName is not null
and isnull(ReferencedTableName,'') = '[db].[schema].[table]'