2015-12-29 277 views

回答

0
DECLARE @Database VARCHAR(255) 
DECLARE @Table VARCHAR(255) 
DECLARE @cmd NVARCHAR(500) 
DECLARE @fillfactor INT 

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR 
SELECT name FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','msdb','tempdb','model','distribution') 
ORDER BY 1 

OPEN DatabaseCursor 

FETCH NEXT FROM DatabaseCursor INTO @Database 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' + 
    table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES 
    WHERE table_type = ''BASE TABLE''' 

    -- create table cursor 
    EXEC (@cmd) 
    OPEN TableCursor 

    FETCH NEXT FROM TableCursor INTO @Table 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     IF (@@MICROSOFTVERSION/POWER(2, 24) >= 9) 
     BEGIN 
      -- SQL 2005 or higher command 
      SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' 
      EXEC (@cmd) 
     END 
     ELSE 
     BEGIN 
      -- SQL 2000 command 
      DBCC DBREINDEX(@Table,' ',@fillfactor) 
     END 

     FETCH NEXT FROM TableCursor INTO @Table 
    END 

    CLOSE TableCursor 
    DEALLOCATE TableCursor 

    FETCH NEXT FROM DatabaseCursor INTO @Database 
END 
CLOSE DatabaseCursor 
DEALLOCATE DatabaseCursor 
+0

其实从本文中可以找到https://www.mssqltips.com/sqlservertip/1367/sql-server-script-to-rebuild- all-indexes-for-all-tables-and-all-databases/ –

+0

但我还没有真正理解它 - 即时通讯新的SQL和现在搞清楚了 –

+0

只要了解'CURSOR'和'DYNAMIC'查询 –

0
+0

默认是0,不是80. 0等于100,或者“完整的叶子页面”。 https://msdn.microsoft.com/en-us/library/ms177459(v=sql.120).aspx – onupdatecascade

+0

我的不好,做了编辑 –

+0

我试着运行代码,但我得到错误消息“A cursor名称“TableCursor”不存在。“我试图拿出数据库光标和数据库名称中的硬编码,但这也不起作用 - 任何人有任何想法? –

0

BEGIN TRAN

DECLARE @table_name VARCHAR(MAX)是什么

DECLARE table_cursor CURSOR LOCAL FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

OPEN table_cursor

FETCH NEXT FROM table_cursor INTO @table_name

WHILE @@FETCH_STATUS = 0 

     BEGIN 

     PRINT 'ALTER INDEX ALL ON '[email protected]_name+' 

REBUILD WITH(FILLFACTOR = 100)”

 END 
     CLOSE table_cursor; 
    DEALLOCATE table_cursor; 

ROLLBACK TRAN