Tsql 查询SQL Server 2012数据库实例中的所有视图

Tsql 查询SQL Server 2012数据库实例中的所有视图,tsql,sql-server-2012,Tsql,Sql Server 2012,我遇到一个问题,下面的查询只是从我连接到的当前数据库中选择视图,而不是全部。是否仍然可以这样做而不使用sp\MSForEachDB DECLARE @useText VARCHAR(500) DECLARE @viewNM VARCHAR(500) DECLARE @schemaNM VARCHAR(500) DECLARE @dbNM VARCHAR(500) DECLARE @sqlCmd varchar(4000) DECLARE DBCursor CURSOR GLOBAL FOR

我遇到一个问题,下面的查询只是从我连接到的当前数据库中选择视图,而不是全部。是否仍然可以这样做而不使用
sp\MSForEachDB

DECLARE @useText VARCHAR(500)
DECLARE @viewNM VARCHAR(500)
DECLARE @schemaNM VARCHAR(500)
DECLARE @dbNM VARCHAR(500)
DECLARE @sqlCmd varchar(4000)

DECLARE DBCursor CURSOR GLOBAL FOR
  SELECT NAME FROM SYS.DATABASES

OPEN DBCursor
FETCH NEXT FROM DBCursor INTO @dbNM

WHILE @@FETCH_STATUS <> -1
BEGIN
    SET @useText = 'USE [' + @dbNM + ']'
    EXEC(@useText)

    DECLARE ViewCursor CURSOR FOR
        SELECT 'GRANT SELECT ON ' + '[' + SCHEMA_NAME(schema_id) + '].[' +  name + ']' + ' TO [account]'
        FROM SYS.VIEWS V

    OPEN ViewCursor
    FETCH NEXT FROM ViewCursor INTO @sqlCmd

    WHILE @@FETCH_STATUS = 0
    BEGIN
         PRINT(@sqlCmd)
         FETCH NEXT FROM ViewCursor INTO @sqlCmd
    END

    CLOSE ViewCursor
    DEALLOCATE ViewCursor

    FETCH NEXT FROM DBCursor INTO @dbNM
END

CLOSE DBCursor
DEALLOCATE DBCursor
DECLARE@useText VARCHAR(500)
声明@viewm VARCHAR(500)
声明@schemaNM VARCHAR(500)
声明@dbNM VARCHAR(500)
声明@sqlCmd varchar(4000)
将DBCursor声明为全局
从SYS.DATABASES中选择名称
打开数据库游标
从DBCursor获取下一个到@dbNM
而@@FETCH\u状态为-1
开始
SET@useText='USE['+@dbNM+']
EXEC(@useText)
将ViewCursor声明为
选择“将“+”['+SCHEMA\u NAME(SCHEMA\u id)+'.['+NAME+']'+'上的选择授予[帐户]”
从SYS.VIEWS V
打开视图光标
从ViewCursor获取下一个到@sqlCmd
而@@FETCH\u STATUS=0
开始
打印(@sqlCmd)
从ViewCursor获取下一个到@sqlCmd
结束
关闭视图光标
取消分配视图光标
从DBCursor获取下一个到@dbNM
结束
关闭数据库游标
释放数据库游标

EXEC
语句执行一个字符串时,该字符串将作为自己的自包含批处理执行。因此,
USE dbname
不会影响
EXEC
之外的查询

我构建了这样一个查询语句,
SELECT'GRANT SELECT ON['+SCHEMA\u NAME(SCHEMA\u id)+'.['+NAME+']TO[account]'FROM[master].SYS.VIEWS V在SYS.VIEWS之前插入数据库名称的位置

见下文:

DECLARE @useText VARCHAR(500)
DECLARE @viewNM VARCHAR(500)
DECLARE @schemaNM VARCHAR(500)
DECLARE @dbNM VARCHAR(500)
DECLARE @sqlCmd varchar(4000)

DECLARE DBCursor CURSOR GLOBAL FOR
  SELECT NAME FROM SYS.DATABASES

OPEN DBCursor
FETCH NEXT FROM DBCursor INTO @dbNM

WHILE @@FETCH_STATUS <> -1
BEGIN

        set @sqlCmd = 'SELECT ''GRANT SELECT ON ['' + SCHEMA_NAME(schema_id) + ''].['' +  name + ''] TO [account]'' FROM [' + @dbNM + '].SYS.VIEWS V;'

        exec( @sqlCmd );

    FETCH NEXT FROM DBCursor INTO @dbNM
END

CLOSE DBCursor
DEALLOCATE DBCursor

嗯,我想你可能对补助金有另一个问题。只能授予或撤消对当前数据库中对象的权限。
set @sqlCmd = 'SELECT ''USE ' + @dbNM + '; GRANT SELECT ON ['' + SCHEMA_NAME(schema_id) + ''].['' +  name + ''] TO [account]'' FROM [' + @dbNM + '].SYS.VIEWS V;'