T-SQL:带有游标的 sp_depends

Posted

技术标签:

【中文标题】T-SQL:带有游标的 sp_depends【英文标题】:T-SQL: sp_depends with a cursor 【发布时间】:2016-07-15 19:53:30 【问题描述】:

我的数据库中有一堆视图,我想获得列出的依赖项。目前,我正在使用“sp_depends”存储过程来执行此操作。为了加快这个过程,我试图在遍历视图列表的游标中使用 sp_depends 存储过程。但是,我没有任何运气,而且我花了很多令人尴尬的时间试图“霰弹枪”修复它。以下是我到目前为止所得到的。

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]'

一切都很好,但在一个循环中,不是那么多。

非常感谢任何帮助。

【问题讨论】:

你的 SQL 版本是多少? 这可能会有所帮助,请查看。***.com/questions/9618134/… 你能在查询中使用Quotename试试吗:set @sql = 'sp_depends ''[dbo].' + Quotename(@viewName) + '' @TheGameiswar @@Version 返回 Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (X64) 2012 年 6 月 11 日 16:41:53 版权所有 (c) Microsoft Corporation 标准版(64 位)在 Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) @Arulkumar 当我进行该更改时,我会收到“名称 'sp_depends '[dbo].[V_Abhangers]' 不是有效标识符。” V_Abhangers 是我的观点之一。 【参考方案1】:

这是一种使用 sys.views 构建动态 sql 字符串的方法。这里不需要游标。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'exec sp_depends ''' + QUOTENAME(name) + ''';'
from sys.views

exec sp_executesql @SQL

【讨论】:

【参考方案2】:

抛开所有性能方面的考虑,看看你的脚本稍有改动的版本,看看它是否适合你:

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 日更新,感谢肖恩

要排除游标逻辑,您还可以使用局部变量赋值,如下所示:

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)

【讨论】:

我知道那是那些糟糕的报价。感谢您的解决方案。 这种类型的东西真的不需要光标。【参考方案3】:

光标很烂:-)。与其在游标中执行过程,为什么不直接从系统表中直接在单个查询中查询您想要的内容。以下将为您提供 sp_depends 使用的实际脚本:

sp_helptext 'sp_depends'

看剧本。抓住选择语句。更新 select 和 where 子句以获取您需要的内容。不要意外覆盖或更改实际的 sp_depends proc,否则您的 DBA 会害死您。

【讨论】:

以上是关于T-SQL:带有游标的 sp_depends的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 查询 - 没有游标的行迭代

SqlServerSqlServer编程语言T-SQL的游标使用

我可以在T-SQL中循环表变量吗?

MySQL存储过程和游标

我可以遍历 T-SQL 中的表变量吗?

第四章 T-SQL编程