这是我发现的:
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
结束
/* ** 现在检查依赖于对象的东西。 */
如果存在(select * from sysdepends where depid = @objid)
开始
raiserror(15460,-1,-1)
插入@sp_depends_xref(RefType、dep_name、类型)
选择不同的 'BY', 'name' = (s.name + '.' + o.name), type = substring(v.name, 5, 16)
从 sysobjects o,
master.dbo.spt_values v,
系统依赖 d,
系统用户 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
选择@found_some = 1
结束
/* ** 我们在 sysdepends 中找到什么了吗? */
如果@found_some = 0
raiserror(15461,-1,-1)
SELECT reftype, dep_name, type, updated, selected, [column]
来自@sp_depends_xref
关闭无计数
return (0) -- sp_depends
去
/** 对象:StoredProcedure [dbo].[usp_FindReferences] 脚本日期:11/18/2009 11:55:05 **/
设置 ANSI_NULLS ON
去
设置 QUOTED_IDENTIFIER ON
去
创建过程 [dbo].[usp_FindReferences]
-- 在此处添加存储过程的参数
@tablename nvarchar(500) = 0,
@colname nvarchar(500) = 0
作为
开始
-- 添加了 SET NOCOUNT ON 以防止额外的结果集 -- 干扰 SELECT 语句。
设置编号;
-- 开始之前--刷新sql模块
将@sql 声明为 nvarchar(max);
设置@sql = '';
选择@sql = @sql + N'开始尝试
exec sp_refreshsqlmodule @name = ''' + CAST(name as nvarchar(4000)) + N''';
结束尝试
开始抓
print ''刷新失败' + CAST(name as nvarchar(4000)) + N': '' + ERROR_MESSAGE();
如果 XACT_STATE() = -1 回滚;
结束捕获;
'
from sys.sysobjects where type in ('P', 'V', 'TF', 'FN');-- 按名称排序;
执行 sp_executesql @sql;
-- 现在我们可以继续处理新数据
创建表 #tempTableDependencies (
引用类型 nvarchar(20),
dep_name nvarchar(500),
键入 nvarchar(500),
更新了 nvarchar(500),
已选择 nvarchar(500),
col nvarchar(500))
插入 #tempTableDependencies 执行 usp_depends2 @tablename
创建表 #tempDependencies (
引用类型 nvarchar(20),
dep_name nvarchar(500),
键入 nvarchar(500),
更新了 nvarchar(500),
已选择 nvarchar(500),
col nvarchar(500))
声明@tempFilteredDependencies 表(
对象名 nvarchar(500),
引用类型 nvarchar(20),
dep_name nvarchar(500),
键入 nvarchar(500),
更新了 nvarchar(500),
已选择 nvarchar(500),
col nvarchar(500))
声明@loopcounter INT
选择 @loopcounter = COUNT(*) FROM #tempTableDependencies
声明 @dependencyname nvarchar(500)
WHILE @loopcounter > 0
开始
SELECT TOP 1 @dependencyname = dep_name
FROM #tempTableDependencies
print 'loop_counter = ' + CAST(@loopcounter as nvarchar(20))
打印'依赖='+@dependencyname
插入 #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
结束
select * from @tempFilteredDependencies 按对象名排序
删除表 #tempDependencies
删除表 #tempTableDependencies
结束
去吧