How to Generate a Create Table DDL Script Along With Its Related Tables
- by Compudicted
Have you ever wondered when creating table diagrams in SQL Server Management Studio (SSMS) how slickly you can add related tables to it by just right-clicking on the interesting table name?    Have you also ever needed to script those related tables including the master one? And you discovered you have dozens of related tables? Or may be no SSMS at your disposal?   That was me one day.   Well, creativity to the rescue!  I Binged and Googled around until I found more or less what I wanted, but it was all involving T-SQL, yeah, a long and convoluted CROSS APPLYs, then I saw a PowerShell solution that I quickly adopted to my needs (I am not referencing any particular author because it was a mashup):        1:  ###########################################################################################################
     2:  # Created by: Arthur Zubarev on Oct 14, 2012                                                              #
     3:  # Synopsys: Generate file containing the root table CREATE (DDL) script along with all its related tables #
     4:  ###########################################################################################################
     5:   
     6:  [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
     7:   
     8:  $RootTableName = "TableName" # The table name, no schema name needed 
     9:   
    10:  $srv = new-Object Microsoft.SqlServer.Management.Smo.Server("TargetSQLServerName")
    11:  $conContext = $srv.ConnectionContext
    12:  $conContext.LoginSecure = $True
    13:  # In case the integrated security is not used uncomment below
    14:  #$conContext.Login = "sa"
    15:  #$conContext.Password = "sapassword"
    16:  $db = New-Object Microsoft.SqlServer.Management.Smo.Database
    17:  $db = $srv.Databases.Item("TargetDatabase")
    18:   
    19:  $scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv)
    20:  $scrp.Options.NoFileGroup = $True
    21:  $scrp.Options.AppendToFile = $False
    22:  $scrp.Options.ClusteredIndexes = $False
    23:  $scrp.Options.DriAll = $False
    24:  $scrp.Options.ScriptDrops = $False
    25:  $scrp.Options.IncludeHeaders = $True
    26:  $scrp.Options.ToFileOnly = $True
    27:  $scrp.Options.Indexes = $False
    28:  $scrp.Options.WithDependencies = $True
    29:  $scrp.Options.FileName = 'C:\TEMP\TargetFileName.SQL'
    30:   
    31:  $smoObjects = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection
    32:  Foreach ($tb in $db.Tables)
    33:  {
    34:     Write-Host -foregroundcolor yellow "Table name being processed" $tb.Name
    35:     
    36:     If ($tb.IsSystemObject -eq $FALSE -and $tb.Name -eq $RootTableName) # feel free to customize the selection condition 
    37:     {
    38:        Write-Host -foregroundcolor magenta $tb.Name "table and its related tables added to be scripted." 
    39:        $smoObjects.Add($tb.Urn)
    40:     }
    41:  }
    42:   
    43:  # The actual act of scripting
    44:  $sc = $scrp.Script($smoObjects)
    45:   
    46:  Write-host -foregroundcolor green $RootTableName "and its related tables have been scripted to the target file."
Enjoy!