Вот что я нашел:
Метод Nir является лучшим, поскольку он находит реальные зависимости (не по тексту хранимой процедуры), хотя он не будет работать должным образом, если вы не обновите модуль sql.
Решения nip и Philip одинаковы - найдите строку в коде хранимой процедуры, она не будет работать должным образом, если у вас одно и то же имя столбца в нескольких таблицах.
Поэтому я решил использовать решение Nir и добавить свой скрипт в usp_FindReferences для обновления модулей sql.
Вот мой последний сценарий:
USE [Cetgroups3]
GO
/****** Object: StoredProcedure [dbo].[usp_depends2] Script Date: 03/16/2011 14:38:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[usp_depends2] --- 1996/08/09 16:51
@objname nvarchar(776) /* the object we want to check */
as
declare @objid int /* the id of the object we want */
declare @found_some bit /* flag for dependencies found */
declare @dbname sysname /* ** Make sure the @objname is local to the current database. */
DECLARE @sp_depends_xref table (
reftype char(2),
dep_name nvarchar(256),
type char(16),
updated char(7),
selected char(8),
[column] nvarchar(128))
select @dbname = parsename(@objname,3)
if @dbname is not null and @dbname <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end
/* ** See if @objname exists. */
select @objid = object_id(@objname)
if @objid is null
begin
select @dbname = db_name()
raiserror(15009,-1,-1,@objname,@dbname)
return (1)
end
/* ** Initialize @found_some to indicate that we haven't seen any dependencies. */
select @found_some = 0
set nocount on
/* ** Print out the particulars about the local dependencies. */
if exists (select * from sysdepends where id = @objid)
begin
raiserror(15459,-1,-1)
INSERT INTO @sp_depends_xref (refType, dep_name , type, updated, selected, [column])
select 'TO', 'name' = (s6.name+ '.' + o1.name), type = substring(v2.name, 5, 16),
updated = substring(u4.name, 1, 7), selected = substring(w5.name, 1,8),
'column' = col_name(d3.depid, d3.depnumber)
from sysobjects o1,
master.dbo.spt_values v2,
sysdepends d3,
master.dbo.spt_values u4,
master.dbo.spt_values w5, --11667
sysusers s6
where o1.id = d3.depid
and o1.xtype = substring(v2.name,1,2) collate database_default
and v2.type = 'O9T'
and u4.type = 'B'
and u4.number = d3.resultobj
and w5.type = 'B'
and w5.number = d3.readobj|d3.selall
and d3.id = @objid
and o1.uid = s6.uid
and deptype < 2
select @found_some = 1
конец
/ * ** Теперь проверим, что зависит от объекта. * /
если существует (выберите * из sysdepends, где depid = @objid)
начать
RAISERROR (15460, -1, -1) * +1008 *
INSERT INTO @sp_depends_xref (RefType, dep_name, type)
выберите различное 'BY', 'name' = (s.name + '.' + o.name), тип = подстрока (v.name, 5, 16)
от sysobjects o,
master.dbo.spt_values v,
sysdepends d,
sysusers s
где o.id = d.id
и o.xtype = substring (v.name, 1,2) collate database_default
и v.type = 'O9T'
и d.depid = @ objid
и o.uid = s.uid
и deptype <2 <br>
выберите @found_some = 1
конец
/ * ** Мы нашли что-нибудь в sysdepends? * /
если @found_some = 0
raiserror (15461, -1, -1)
ВЫБЕРИТЕ reftype, dep_name, type, updated, selected, [column]
ОТ @sp_depends_xref
отключить отсчет
return (0) - sp_depends
GO
/ ** Объект: StoredProcedure [dbo]. [Usp_FindReferences] Дата сценария: 18.11.2009 11:55:05 ** /
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo]. [Usp_FindReferences]
- Добавьте параметры для хранимой процедуры здесь
@tablename nvarchar (500) = 0,
@colname nvarchar (500) = 0
КАК
НАЧАТЬ
- SET NOCOUNT ON добавлено, чтобы не допустить - дополнительные наборы результатов не будут мешать операторам SELECT.
SET NOCOUNT ON;
- перед началом - обновить модуль sql
объявите @sql как nvarchar (max);
set @sql = '';
выберите @sql = @sql + N'попробуйте
exec sp_refreshsqlmodule @name = '' '+ CAST (имя как nvarchar (4000)) + N' '';
конец попробовать
начать ловить
print '' Не удалось обновить '+ CAST (имя как nvarchar (4000)) + N': '' + ERROR_MESSAGE ();
IF XACT_STATE () = -1 ROLLBACK;
конечный улов;
'
из sys.sysобъекты, где введите ('P', 'V', 'TF', 'FN'); - порядок по имени;
exec sp_executesql @sql;
- Теперь мы можем приступить к свежим данным
создать таблицу #tempTableDependencies (
reftype nvarchar (20),
имя_пункта nvarchar (500),
тип nvarchar (500),
обновленный nvarchar (500),
выбранный nvarchar (500),
col nvarchar (500))
вставить в #tempTableDependencies выполнить usp_depends2 @tablename
создать таблицу #tempDependencies (
reftype nvarchar (20),
имя_пункта nvarchar (500),
тип nvarchar (500),
обновленный nvarchar (500),
выбранный nvarchar (500),
col nvarchar (500))
объявить таблицу @tempFilteredDependencies (
имя объекта nvarchar (500),
reftype nvarchar (20),
имя_пункта nvarchar (500),
тип nvarchar (500),
обновленный nvarchar (500),
выбранный nvarchar (500),
col nvarchar (500))
ОБЪЯВИТЬ @loopcounter INT
select @loopcounter = COUNT (*) FROM # tempTableDependencies
ОБЪЯВИТЬ @dependencyname nvarchar (500)
WHILE @loopcounter> 0
НАЧАТЬ
ВЫБЕРИТЕ ТОП 1 @dependencyname = dep_name
FROM # tempTableDependencies
print 'loop_counter =' + CAST (@loopcounter as nvarchar (20))
выведите 'зависимость =' + @ имя зависимости
вставить в #tempDependencies выполнить usp_depends2 @dependencyname
insert into @tempFilteredDependencies
select @dependencyname as objectname, *
from #tempDependencies
where col = @colname
and dep_name like '%' + @tablename
delete from #tempDependencies
delete from #tempTableDependencies
where dep_name = @dependencyname
SET @loopcounter = @loopcounter - 1
END
выберите * из порядка @tempFilteredDependencies по имени объектаудалить таблицу # tempDependencies
удалить таблицу # tempTableDependencies
END
GO