Sql server 2008 SQL Server:您能帮我完成这个查询吗?

Sql server 2008 SQL Server:您能帮我完成这个查询吗?,sql-server-2008,information-schema,Sql Server 2008,Information Schema,我想在SQL Server 2008数据库服务器上运行诊断报告 我将遍历所有数据库,然后针对每个数据库,我希望查看每个表。但是,当我用tbl_游标查看每个表时,它总是会选择数据库“master”中的表 我想这是因为我选择了tbl_光标: SELECT table_name FROM information_schema.tables WHERE table_type = 'base table' 我该如何解决这个问题 以下是完整的代码: SET NOCOUNT ON DECLARE

我想在SQL Server 2008数据库服务器上运行诊断报告

我将遍历所有数据库,然后针对每个数据库,我希望查看每个表。但是,当我用tbl_游标查看每个表时,它总是会选择数据库“master”中的表

我想这是因为我选择了tbl_光标:

    SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'
我该如何解决这个问题

以下是完整的代码:

SET NOCOUNT ON

DECLARE @table_count INT
DECLARE @db_cursor VARCHAR(100)
DECLARE database_cursor CURSOR FOR
SELECT name FROM sys.databases where name<>N'master'
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @db_cursor
WHILE @@Fetch_status = 0
BEGIN

    PRINT @db_cursor    
    SET @table_count = 0

    DECLARE @table_cursor VARCHAR(100)
    DECLARE tbl_cursor CURSOR FOR
    SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'
    OPEN tbl_cursor
    FETCH NEXT FROM tbl_cursor INTO @table_cursor
    WHILE @@Fetch_status = 0
    BEGIN

        DECLARE @table_cmd NVARCHAR(255)
        SET @table_cmd = N'IF NOT EXISTS( SELECT TOP(1) *  FROM ' + @table_cursor + ') PRINT N''     Table ''''' + @table_cursor + ''''' is empty'' '
        --PRINT @table_cmd --debug
        EXEC sp_executesql @table_cmd
        SET @table_count = @table_count + 1

    FETCH NEXT FROM tbl_cursor INTO @table_cursor
    END
    CLOSE tbl_cursor
    DEALLOCATE tbl_cursor

    PRINT @db_cursor + N' Total Tables : ' + CAST( @table_count as varchar(2) ) 
    PRINT N'' -- print another blank line   
    SET @table_count = 0    

FETCH NEXT FROM database_cursor INTO @db_cursor
END
CLOSE database_cursor
DEALLOCATE database_cursor




SET NOCOUNT OFF

使用表变量更容易,因此可以使用另一个动态SQL语句将行添加到@tablist

SET NOCOUNT ON

DECLARE @table_count INT
DECLARE @dblist TABLE (DBName VARCHAR(100))
DECLARE @tablist TABLE (TableName VARCHAR(100))
DECLARE @dbname varchar(100), @tabname varchar(100)

INSERT @dblist 
SELECT name FROM sys.databases where name<>N'master'

SELECT TOP 1 @dbname = DBName FROM @dblist
WHILE @@ROWCOUNT <> 0
BEGIN

    INSERT @tablist (tableName)
    EXEC ('SELECT table_name FROM ' + @dbname + '.information_schema.tables WHERE table_type = ''base table'' ')

    SELECT TOP 1 @tabname = tableName FROM @tablist
    WHILE @@ROWCOUNT <> 0
    BEGIN

--do my stuff

        DELETE @tablist WHERE tableName =  @tabname
        SELECT TOP 1 @tabname = tableName FROM @tablist
    END

    DELETE @dblist WHERE DBName =  @dbname
    SELECT TOP 1 @dbname = DBName FROM @dblist
END

使用表变量更容易,因此可以使用另一个动态SQL语句将行添加到@tablist

SET NOCOUNT ON

DECLARE @table_count INT
DECLARE @dblist TABLE (DBName VARCHAR(100))
DECLARE @tablist TABLE (TableName VARCHAR(100))
DECLARE @dbname varchar(100), @tabname varchar(100)

INSERT @dblist 
SELECT name FROM sys.databases where name<>N'master'

SELECT TOP 1 @dbname = DBName FROM @dblist
WHILE @@ROWCOUNT <> 0
BEGIN

    INSERT @tablist (tableName)
    EXEC ('SELECT table_name FROM ' + @dbname + '.information_schema.tables WHERE table_type = ''base table'' ')

    SELECT TOP 1 @tabname = tableName FROM @tablist
    WHILE @@ROWCOUNT <> 0
    BEGIN

--do my stuff

        DELETE @tablist WHERE tableName =  @tabname
        SELECT TOP 1 @tabname = tableName FROM @tablist
    END

    DELETE @dblist WHERE DBName =  @dbname
    SELECT TOP 1 @dbname = DBName FROM @dblist
END

问题是因为您实际上总是在master db上下文下运行INFORMATION_SCHEMA.TABLES查询

您需要将tbl_游标块转换为动态SQL,以便使用DB名称完全限定查询

e、 g


基本上就是您需要为该游标执行的操作。

问题在于您实际上总是在master db上下文下运行INFORMATION\u SCHEMA.TABLES查询

您需要将tbl_游标块转换为动态SQL,以便使用DB名称完全限定查询

e、 g


基本上就是您需要为该游标执行的操作。

您可能需要创建动态SQL。因为information_schema将仅从当前活动数据库中获取对象,您正在对其运行此查询


您可以尝试sys.objects

您可能需要创建动态SQL。因为information_schema将仅从当前活动数据库中获取对象,您正在对其运行此查询


你可以试试sys.objects

@rib:没有mssql这样的东西。该产品称为SQL Server。MS SQL很容易与MySQL混淆。@rib:没有MS SQL这样的东西。该产品称为SQL Server。MS SQL很容易与MySQL混淆。