Description

I needed a quick way to generate index creation statements for every index on each table in a specified database.  By default this output is displayed in the powershell console as well as added to a text file in the c:\temp\ directory.  The script lists each schema.tablename and outputs the text in green to indicate an existing clustered index, or red to indicate no clustered index.  Each index create statement for the table is then output to the console.  Green indicates a clustered index and grey indicates a non-clustered index.  You can easily modify the script to only output to the console, or to the file, change formatting, etc. 

PowerShell
Edit|Remove
# ======================================================================================================================================================================================= 
# AUTHOR    :    Ryan M. Rinehart -- MCITP:Database Administrator (2005/2008), MCITP:Enterprise Administrator, MCDBA, MCSE (2000/2003) 
# EMAIL        :    rrinehart77@hotmail.com 
# NAME        :     smoIndexScripts.ps1 
# VERSION    :    1.1  
# DATE      :     7/7/2011 
# DESCRIPTION    :    Connects to the specified SQL Server and lists the specified DB's indexes as a T-SQL CREATE INDEX or ADD CONSTRAINT statement to the powershell console & a .txt file 
# COMMENT(s)    :     1.0 == Uses SQL SMO Objects to loop through tables in the selected database, listing creation statements for detected indexes.   
#                   Install SMO (Microsoft® SQL Server® 2008 R2 Shared Management Objects) From -- http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=16978 
# ======================================================================================================================================================================================= 
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")     
$sqlServer = [string]"."                              
$database = [string]"AdventureWorks2008R2"                                  
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($sqlServer$filepath = "C:\temp\" + $sqlServer + "-" + $database + "-IndexDetails.txt" 
foreach($db in $server.Databases)                             
{  
    if($db.name -eq $database)                                 
    { 
        $line = [string]"Server:" + $sqlServer + "`t" + "Database:" + $db.Name + "`t" + "DBID:" + $db.ID + "`t" + "RecoveryModel:" + $db.recoveryModel  
        write-host $line 
        out-file -filePath $filePath -inputobject $line -force -append  
        out-file -filepath $filePath -inputobject "`r" -force -append 
        Write-host "`r" 
        foreach($table in $db.Tables)                             
        { 
            If($table.HasClusteredIndex -eq $True)                 
            { 
                $line = "-->[" + $table.schema + "].[" + $table.name + "] HAS an EXISTING CLUSTERED INDEX!!" 
                write-host $line -foregroundcolor "Green" 
                out-file -filePath $filePath -inputobject $line -force -Append 
            } 
            else 
            { 
                $line = "-->[" + $table.schema + "].[" + $table.name + "] DOES NOT HAVE a clustered index..."  
                write-host $line -foregroundcolor "Red" 
                out-file -filePath $filePath -inputobject $line -force -append 
            } 
            foreach($index in $table.indexes)                     
            { 
                if($index.ID -eq 1) 
                { 
                    write-host $index.script() -foregroundColor "Green" 
                    out-file -filePath $filePath -inputobject $index.script() -force -append 
                    out-file -filepath $filePath -inputobject "`r" -force -append 
                    write-host "`r" 
                     
                } 
                else 
                { 
                    write-host $index.script() -foregroundcolor "Gray" 
                    out-file -filePath $filePath -inputobject $index.script() -force -append 
                    out-file -filepath $filePath -inputobject "`r" -force -append 
                    write-host "`r" 
                     
                } 
            } 
            write-host "`r" 
            out-file -filepath $filePath -inputobject "`r" -force -append 
        } 
    } 
}  
write-host "INDEX CREATION STATEMENTS GENERATED!!!"