T-SQL:带有游标

时间:2016-07-15 19:53:31

标签: sql-server database tsql cursor

我的数据库中有一堆视图,我想要列出的依赖项。目前,我正在使用' sp_depends' sproc这样做。为了加快这个过程,我尝试在迭代视图列表的游标中使用sp_depends sproc。但是,我没有运气,而且我花了很多时间来尝试霰弹枪"修理它。以下是我到目前为止所做的事情。

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

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

declare @SQL nvarchar(max) = ''

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

exec sp_executesql @SQL

答案 1 :(得分:0)

游标很糟糕:-)。而不是在游标中执行proc,为什么不直接从系统表直接查询单个查询中的内容。以下内容将为您提供sp_depends使用的实际脚本:

sp_helptext 'sp_depends'

看一下脚本。抓住select语句。更新select和where子句以获取所需内容。不要意外覆盖或更改实际的sp_depends proc,否则你的DBA会杀了你。

答案 2 :(得分:0)

除了所有性能考虑因素外,请查看稍微更改过的脚本版本,看看它是否适合您:

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)