Compare-DatabaseSchema (modification of post by view diff)
embed code: <script type="text/javascript" src="http://PoshCode.org/embed/865"></script>download | new post
Compare the tables (and columns with the -Column parameter) in two databases, checking for differences.
- param( $SqlServerOne = 'YourDatabaseServer',
- $FirstDatabase = 'FirstDatabaseToCompare',
- $SqlUsernameOne = 'SQL Login',
- $SqlPasswordOne = 'SQL Password',
- $SqlServerTwo = 'YourDatabaseServer',
- $SecondDatabase = 'SecondDatabaseToCompare',
- $SqlUsernameTwo = 'SQL Login',
- $SqlPasswordTwo = 'SQL Password',
- $FilePrefix = 'Log',
- [switch]$Log,
- [switch]$Column)
- $File = $FilePrefix + '{0}-{1}.csv'
- $TableQuery = @"
- select sysobjects.name as TableName
- from sysobjects
- where sysobjects.xtype like 'U' and --specify only user tables
- sysobjects.name not like 'dtproperties' --specify only user tables
- "@
- function Run-Query()
- {
- param (
- $SqlQuery,
- $SqlServer,
- $SqlCatalog,
- $SqlUser,
- $SqlPass
- )
- $SqlConnString = "Server = $SqlServer; Database = $SqlCatalog; user = $SqlUser; password = $SqlPass"
- $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
- $SqlConnection.ConnectionString = $SqlConnString
- $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
- $SqlCmd.CommandText = $SqlQuery
- $SqlCmd.Connection = $SqlConnection
- $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
- $SqlAdapter.SelectCommand = $SqlCmd
- $DataSet = New-Object System.Data.DataSet
- $a = $SqlAdapter.Fill($DataSet)
- $SqlConnection.Close()
- $DataSet.Tables | Select-Object -ExpandProperty Rows
- }
- $TablesDBOne = Run-Query -SqlQuery $TableQuery -SqlServer $SqlServerOne -SqlCatalog $FirstDatabase -SqlUser $SqlUsernameOne -SqlPass $SqlPasswordOne | Select-Object -Property TableName
- $TablesDBTwo = Run-Query -SqlQuery $TableQuery -SqlServer $SqlServerTwo -SqlCatalog $SecondDatabase -SqlUser $SqlUsernameTwo -SqlPass $SqlPasswordTwo | Select-Object -Property TableName
- Write-Host 'Differences in Tables: '
- $Database = @{Name='Database';Expression={if ($_.SideIndicator -eq '<='){'{0} / {1}' -f $FirstDatabase, $SqlServerOne} else {'{0} / {1}' -f $SecondDatabase, $SqlServerTwo}}}
- $TableDifference = Compare-Object $TablesDBOne $TablesDBTwo -SyncWindow (($TablesDBOne.count + $TablesDBTwo.count)/2) -Property TableName | select TableName, $Database
- if ($log)
- {
- $TableDifference | Export-Csv -Path ($file -f $FirstDatabase, $SecondDatabase) -NoTypeInformation
- }
- $TableDifference | Sort-Object -Property TableName, Database
- if ($Column)
- {
- #Compare columns in matching tables in DB
- $SameTables = Compare-Object $TablesDBOne $TablesDBTwo -SyncWindow (($TablesDBOne.count + $TablesDBTwo.count)/2) -Property TableName -IncludeEqual -ExcludeDifferent
- $ColumnQuery = @"
- select sysobjects.name as TableName
- , syscolumns.name as ColumnName
- , systypes.name as Type
- , systypes.Length
- , systypes.XUserType
- from sysobjects, syscolumns, systypes
- where sysobjects.xtype like 'U' and --specify only user tables
- sysobjects.name not like 'dtproperties' and --specify only user tables
- syscolumns.xusertype= systypes.xusertype --get data type info
- and sysobjects.id=syscolumns.id
- and sysobjects.name = '{0}'
- order by sysobjects.name, syscolumns.name, syscolumns.type
- "@
- Write-Host "`n`n"
- Read-Host 'Press Enter to Check for Column Differences'
- foreach ($Table in $SameTables)
- {
- $ColumnsDBOne = Run-Query -SqlQuery ($ColumnQuery -f $table.tablename) -SqlServer $SqlServerOne -SqlCatalog $FirstDatabase -SqlUser $SqlUsernameOne -SqlPass $SqlPasswordOne | Select-Object -Property TableName, ColumnName, Type, Length, XUserType
- $ColumnsDBTwo = Run-Query -SqlQuery ($ColumnQuery -f $table.tablename) -SqlServer $SqlServerTwo -SqlCatalog $SecondDatabase -SqlUser $SqlUsernameTwo -SqlPass $SqlPasswordTwo | Select-Object -Property TableName, ColumnName, Type, Length, XUserType
- $ColumnDifference = Compare-Object $ColumnsDBOne $ColumnsDBTwo -SyncWindow (($ColumnsDBOne.count + $ColumnsDBTwo.count)/2) -Property TableName, ColumnName, Type, Length, XUserType | Select-Object TableName, ColumnName, Type, Length, XUserType, $Database
- if ($log -and $ColumnDifference )
- {
- $ColumnDifference | Export-Csv -Path ($file -f $Table.TableName,'Columns' ) -NoTypeInformation
- }
- $ColumnDifference | sort ColumnName, Database
- }
- }
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.
PowerShell Code Repository