2015-12-29 273 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