T-SQL: sp_depends 带光标
T-SQL: sp_depends with a cursor
我的数据库中有一堆视图,我想列出它们的依赖项。目前,我正在使用 'sp_depends' 存储过程来执行此操作。为了加快这个过程,我试图在遍历视图列表的游标中使用 sp_depends 存储过程。但是,我运气不好,我花了很多时间来尝试 "shotgun" 修复它。以下是我到目前为止所得到的。
DECLARE @ViewNames TABLE
(
ViewName VARCHAR(255)
)
INSERT INTO @ViewNames
select name from [AMF_Article].sys.views
declare @tableCursor cursor,
@viewName varchar(100);
set @tableCursor = cursor for select ViewName from @ViewNames
open @tableCursor
fetch next from @tableCursor into @viewName
while(@@fetch_status = 0)
begin
declare @sql varchar(max)
set @sql = 'sp_depends ''[dbo].' + @viewName + ''
PRINT @sql
exec @sql
fetch next from @tableCursor into @viewName
end
我认为引用与 EXEC 调用相结合是有问题的。我无法让我的单引号匹配,当我这样做时,它仍然告诉我不。当我运行声明
sp_depends '[dbo].[V_AMF_Distinct_Products]'
一切都很好,但在一个循环中,不是那么多。
非常感谢任何帮助。
光标很烂 :-)。与其在游标中执行过程,不如直接从系统表中直接在单个查询中查询你想要的内容。下面会给出sp_depends实际使用的脚本:
sp_helptext 'sp_depends'
看剧本。抓住 select 语句。更新 select 和 where 子句以获取您需要的内容。不要不小心覆盖或更改实际的 sp_depends 过程,否则你的 DBA 会杀了你。
这是一种使用 sys.views 构建动态 sql 字符串的方法。这里不需要游标。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'exec sp_depends ''' + QUOTENAME(name) + ''';'
from sys.views
exec sp_executesql @SQL
抛开所有性能方面的考虑,查看稍微更改过的脚本版本,看看它是否适合您:
DECLARE @tableCursor CURSOR
DECLARE @viewName sysname;
DECLARE @schemaName sysname;
SET @tableCursor = CURSOR FOR
SELECT SS.name SchemaName, SV.name ViewName FROM sys.views SV
JOIN sys.schemas SS ON SS.schema_id=SV.schema_id
OPEN @tableCursor
FETCH NEXT FROM @tableCursor INTO @schemaName, @viewName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql varchar(max)
SET @sql = 'sp_depends '''+QUOTENAME(@schemaName) + '.' + QUOTENAME(@viewName) + ''''
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM @tableCursor INTO @schemaName, @viewName
END
CLOSE @tableCursor
DEALLOCATE @tableCursor
2016 年 7 月 16 日更新,感谢 Sean
要排除游标逻辑,您还可以使用如下局部变量赋值:
DECLARE @sql nvarchar(MAX)=''
SELECT @sql += 'sp_depends '''+QUOTENAME(SS.name) + '.' + QUOTENAME(SV.name) + ''';'
FROM sys.views SV
JOIN sys.schemas SS ON SS.schema_id=SV.schema_id
EXEC(@sql)
我的数据库中有一堆视图,我想列出它们的依赖项。目前,我正在使用 'sp_depends' 存储过程来执行此操作。为了加快这个过程,我试图在遍历视图列表的游标中使用 sp_depends 存储过程。但是,我运气不好,我花了很多时间来尝试 "shotgun" 修复它。以下是我到目前为止所得到的。
DECLARE @ViewNames TABLE
(
ViewName VARCHAR(255)
)
INSERT INTO @ViewNames
select name from [AMF_Article].sys.views
declare @tableCursor cursor,
@viewName varchar(100);
set @tableCursor = cursor for select ViewName from @ViewNames
open @tableCursor
fetch next from @tableCursor into @viewName
while(@@fetch_status = 0)
begin
declare @sql varchar(max)
set @sql = 'sp_depends ''[dbo].' + @viewName + ''
PRINT @sql
exec @sql
fetch next from @tableCursor into @viewName
end
我认为引用与 EXEC 调用相结合是有问题的。我无法让我的单引号匹配,当我这样做时,它仍然告诉我不。当我运行声明
sp_depends '[dbo].[V_AMF_Distinct_Products]'
一切都很好,但在一个循环中,不是那么多。
非常感谢任何帮助。
光标很烂 :-)。与其在游标中执行过程,不如直接从系统表中直接在单个查询中查询你想要的内容。下面会给出sp_depends实际使用的脚本:
sp_helptext 'sp_depends'
看剧本。抓住 select 语句。更新 select 和 where 子句以获取您需要的内容。不要不小心覆盖或更改实际的 sp_depends 过程,否则你的 DBA 会杀了你。
这是一种使用 sys.views 构建动态 sql 字符串的方法。这里不需要游标。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'exec sp_depends ''' + QUOTENAME(name) + ''';'
from sys.views
exec sp_executesql @SQL
抛开所有性能方面的考虑,查看稍微更改过的脚本版本,看看它是否适合您:
DECLARE @tableCursor CURSOR
DECLARE @viewName sysname;
DECLARE @schemaName sysname;
SET @tableCursor = CURSOR FOR
SELECT SS.name SchemaName, SV.name ViewName FROM sys.views SV
JOIN sys.schemas SS ON SS.schema_id=SV.schema_id
OPEN @tableCursor
FETCH NEXT FROM @tableCursor INTO @schemaName, @viewName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql varchar(max)
SET @sql = 'sp_depends '''+QUOTENAME(@schemaName) + '.' + QUOTENAME(@viewName) + ''''
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM @tableCursor INTO @schemaName, @viewName
END
CLOSE @tableCursor
DEALLOCATE @tableCursor
2016 年 7 月 16 日更新,感谢 Sean
要排除游标逻辑,您还可以使用如下局部变量赋值:
DECLARE @sql nvarchar(MAX)=''
SELECT @sql += 'sp_depends '''+QUOTENAME(SS.name) + '.' + QUOTENAME(SV.name) + ''';'
FROM sys.views SV
JOIN sys.schemas SS ON SS.schema_id=SV.schema_id
EXEC(@sql)