Capturing SQL Generated by SMO in Powershell

The following example uses the get-sqlserver.ps1 script in my search path.

get-sqlserver.ps1:

 param ($server=".")  
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 
new-object Microsoft.SqlServer.Management.Smo.Server $server;

This example will shows how to use SMO objects to generate a SQL Script that will drop all the rowguid columns from the adventure works database:

 PS C:\demo> $srv = get-sqlserver  
PS C:\demo> $db = $srv.Databases["adventureworks"] 
# Find the tables that have a rowguid column 
PS C:\demo> foreach ($tbl in $db.tables) {$tbl.columns | %{ if($_.name -eq "rowguid") {$tbl.name}}} 
Employee 
EmployeeAddress 
Address 
AddressType 
Contact 
StateProvince 
Product 
... 

# set SMO connection to capture mode 
PS C:\demo> $srv.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::capturesql 

# drop the row guid column & alter the table  
#  SMO is set to capture only so the database is not updated 
PS C:\demo> foreach ($tbl in $db.tables) {$tbl.columns | %{ if($_.name -eq "rowguid") {$_.drop();$tbl.alter();}}} 

# Check the captured sql
PS C:\demo> $srv.ConnectionContext.CapturedSql.Text 
USE [adventureworks] 
ALTER TABLE [HumanResources].[Employee] DROP CONSTRAINT [DF_Employee_rowguid] 
ALTER TABLE [HumanResources].[Employee] DROP COLUMN [rowguid] 
... 

# save the sql to a file 
PS C:\demo> $srv.ConnectionContext.CapturedSql.Text | sc update.sql