代码之家  ›  专栏  ›  技术社区  ›  rlb.usa

SQL Server:您能帮我处理这个查询吗?

  •  1
  • rlb.usa  · 技术社区  · 15 年前

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

    我正在循环访问所有数据库,然后对于每个数据库,我想查看每个表。但是,当我去看每张桌子时 tbl_cursor ,它总是在数据库中提取表 'master' .

    我想是因为我 光标游标 选择:

        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
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   AdaTheDev    15 年前

    问题是因为您实际上总是在master db上下文下运行information\schema.tables查询。

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

    例如

    SELECT table_name FROM YourDatabase.INFORMATION_SCHEMA.TABLES WHERE....
    

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

        2
  •  2
  •   gbn    15 年前

    使用表变量更容易,因此可以使用另一个动态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
    
        3
  •  0
  •   Sundararajan S    15 年前

    您可能需要创建动态SQL。因为信息模式将只从运行此查询的当前活动数据库中获取对象。

    您可以尝试sys.objects