Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 сравнение таблиц (данных) - tablediff в топку  [new]
zindur
Member

Откуда:
Сообщений: 86
Нужна утилита наподобие TableDiff.exe - командная строка (тоесть можно заскриптовать и проверить Data определьонного списка таблиц), один толстый минус :(
Нету опции указать только нужные столбцы для сравнения (или столбцы для игнорирования)

Желательно free :)
Спасибо
13 май 13, 16:01    [14288337]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
zindur,

Создайте таблицы с нужными столбцами (INSERT INTO) и делайте сверку утилитой.
13 май 13, 16:13    [14288456]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
zindur
Member

Откуда:
Сообщений: 86
trew
zindur,

Создайте таблицы с нужными столбцами (INSERT INTO) и делайте сверку утилитой.


тоже думал - но данных очень много, потом надо следить чтоб и PK тоже создавался - нетто tablediff будет матерится
13 май 13, 16:24    [14288564]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Сделать views и сравнивать их.
13 май 13, 16:46    [14288748]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
zindur
Member

Откуда:
Сообщений: 86
invm
Сделать views и сравнивать их.


ооо незнал что этот tablediff может диффить и views
Спасибо :) будем работать пока в етом направлении

но если у когото есть другие тоолзы или идей - милости просим :)
13 май 13, 17:26    [14289020]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
zindur
Member

Откуда:
Сообщений: 86
сварганил скрипт - может комуто пригодится
+
# Description:  PS script to execute tablediff to compere and find all differences in data between 2 databases.
# Version:  1.0
# execution command:
# powershell -noexit -ExecutionPolicy Unrestricted DoDBDiff.ps1
 
param(
 [string]$SourceServer   = "(local)"
,[string]$SourceDatabase = "DB1"
,[string]$SourceUser     = "sa"
,[string]$Sourcepassword = "password"


,[string]$DestinationServer   = "(local)" #"SWIFT"
,[string]$DestinationDatabase = "DB2"
,[string]$DestinationUser     = "sa"
,[string]$DestinationPassword = "password"


,[string]$OutputFolder = "E:\DB_Diff_Test"
)

# Create a Table List
$i = $null
$TableList = New-Object 'object[,]' 3,5 # 3 number of rec, 5 columns of Array TODO load from file
# Populate Table Array with tables and columns
# 1 is enabled for compare 
$i ++ 
$TableList += ,@($i, 'SchemaName','Table1', 1, "'Column1','Column2','Column3'") # Columns what will be ignored on TableDiff
$i ++ 
$TableList += ,@($i, 'SchemaName','Table2', 1, '') #
$i ++ 
$TableList += ,@($i, 'SchemaName','Table3', 1, '') #

#set path to tablediff utility
$TableDiff = "c:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe"

$Logfile = $OutputFolder + "\Output.log"
#Output file
$OutputFile = $OutputFolder+"\TableDiff_Output.log"

$Msg = "" # common var for messages
$DiffCount  = 0 # counter for output results
$ErrorCount = 0 # counter for output results

$ViewPrefix = "VW_" # Prefix what will be used to create Views

Function LogWrite
{
   Param ([string]$logstring
          )
   $a = Get-Date -format "yyyyMMdd hh:mm:ss"
   $s = $a + " " + $logstring
   write-host $s
   Add-content $Logfile -value $s
}

function Run-Query()
{
    param (
     [string]$SqlQuery
    ,[string]$SqlServer
    ,[string]$SqlCatalog
    ,[string]$SqlUser
    ,[string]$SqlPass
    )

  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection("server=$SqlServer;database=$SqlCatalog;User Id=$SqlUser;Password=$SqlPass;");
  $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

  # shota ne furycit u meneja Invoke-Sqlcmd ??
  #****Invoke-Sqlcmd -Query "SqlQuery;" -S $SqlServer -d $SqlCatalog -U $SqlUser -P $SqlPass -Verbose

}

function CreateView ([string]$DBTarget   # Create View on Source or Destination
                    ,[string]$SchemaName
                    ,[string]$TableName
                    ,[string]$IgnoreColumns = ''
                    ) 
{
  #Init
  $ViewTableName = $ViewPrefix + $TableName # Adjust Table Name to View Name

  if ($IgnoreColumns -eq "") {
    $IgnoreColumns = "''"
  }
  # Set Var for Connection
  switch ($DBTarget) 
  {
    'Source'      {
                    $TargetServer   = $SourceServer
                    $TargetDataBase = $SourceDatabase
                    $TargetUser     = $SourceUser
                    $TargetPassword = $Sourcepassword
                  }
    'Destination' {
                    $TargetServer   = $DestinationServer
                    $TargetDataBase = $DestinationDatabase
                    $TargetUser     = $DestinationUser
                    $TargetPassword = $DestinationPassword
                  }
    default { $Msg = "CreateView.Wrong DB Target: $DBTarget"
              LogWrite $Msg
              throw $Msg
            }
  }
  #Drop View if Exist
  LogWrite "Drop View : $SchemaName . $ViewTableName"
  $ViewQuery = "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
                  WHERE table_name = '$ViewTableName'
                    AND table_schema = '$SchemaName')
                DROP VIEW $SchemaName.$ViewTableName"
  LogWrite $ViewQuery
  $QueryResult = Run-Query -SqlQuery $ViewQuery `
                           -SqlServer $TargetServer `
                           -SqlCatalog $TargetDataBase `
                           -SqlUser $TargetUser `
                           -SqlPass $TargetPassword #| Select-Object -Property TableName
  #Get View Columns
  $ViewQuery = "SELECT Column_Name 
                FROM 
                  INFORMATION_SCHEMA.Columns 
                WHERE table_name = '$TableName'
                AND table_schema = '$SchemaName'
                AND COLUMN_NAME not in ($IgnoreColumns)
                "
  $QueryResult = Run-Query -SqlQuery $ViewQuery `
                           -SqlServer $TargetServer `
                           -SqlCatalog $TargetDataBase `
                           -SqlUser $TargetUser `
                           -SqlPass $TargetPassword | Select-Object -Property Column_Name

  $ViewColumns = '*'
  if ($QueryResult.Length -gt 0) {
      $ViewColumns = ""
      foreach ($ColumnName in $QueryResult) 
      {
        #
        if ($ViewColumns.Length -gt 0) {
          $ViewColumns = $ViewColumns + ', ' + $ColumnName.Column_Name
        } else {
          $ViewColumns = $ColumnName.Column_Name
        }
      }
  }

  #Create View
  LogWrite "Create View : $SchemaName . $ViewTableName"
  $ViewQuery = "CREATE VIEW $SchemaName.$ViewTableName
               AS
               SELECT $ViewColumns
               FROM $SchemaName.$TableName 
                "

  LogWrite $ViewQuery
  $QueryResult = Run-Query -SqlQuery $ViewQuery `
                           -SqlServer $TargetServer `
                           -SqlCatalog $TargetDataBase `
                           -SqlUser $TargetUser `
                           -SqlPass $TargetPassword #| Select-Object -Property TableName
}
 
#create output folder if it does not exist
if ((Test-Path $OutputFolder) -eq $false)
  {
  md $OutputFolder
  }
else
  {
  $Msg = "Clear folder: " + $OutputFolder
  LogWrite $Msg
  $ClearFolderMask = $OutputFolder + '\*.*'
  # catch deleting from root
  if ($ClearFolderMask.Length -ge 6)
    {
    Remove-Item -path $ClearFolderMask
    #Remove-Tree $OutputFolder
    #md $OutputFolder
    }
  else
    {
    $Msg = "Can't clear folder like: " + $OutputFolder
    LogWrite $Msg
    throw $Msg
    }
  }
 

###clear-host  
LogWrite "==========STARTED==============" 


#for each table
foreach($Table in $TableList)
{
  # Process just enabled as Active
  if (($Table.Length -gt 0) -and ($Table[3] -eq 1))
    {
      #create new file name for the Transact-SQL script file
      $DiffScript = $OutputFolder + "\" + $Table[1] + "_" + $Table[2] + ".sql"
      # comment follow line for common log
      $OutputFile = $OutputFolder + "\" + $Table[1] + "_" + $Table[2] + ".log"
 
      #If file exists throw the errror.
      if ((Test-Path $DiffScript) -eq $true)
        {
        $Msg = "Already Exists: " + $DiffScript 
        LogWrite $Msg
        #throw $Msg
        }
      else 
        {
          ## Create Views
          CreateView 'Source' $Table[1] $Table[2] $Table[4]
          CreateView 'Destination' $Table[1] $Table[2] $Table[4]

          ## execute tablediff
          ## -q Perform a fast comparison by only comparing row counts and schema.
          $Msg = "Execute TableDiff: " + $Table[1] + " " + $Table[2]
          LogWrite $Msg
          & $TableDiff -sourceserver $SourceServer `
                       -sourceuser $SourceUser `
                       -sourcepassword $Sourcepassword `
                       -sourcedatabase $SourceDatabase `
                       -sourceschema $Table[1] `
                       -sourcetable $ViewPrefix + $Table[2] `
                       -destinationserver $DestinationServer `
                       -destinationuser $DestinationUser `
                       -destinationpassword $DestinationPassword `
                       -destinationdatabase $DestinationDatabase `
                       -destinationschema $Table[1] `
                       -destinationtable $ViewPrefix + $Table[2]  `
                       -o $OutputFile `
                       -f $DiffScript `                     

          ##invoke-expression "$TableDiff $cmdLine" | out-null
 
          # check the return value and throw an exception if needed
          # tablediff return values: 0 - Success, 1 - Critical error, 2 - Table differences
          switch ($LastExitCode) 
          {
            # succes no diff
            0 {
                # do nothing :)
              }
            # Critical Error
            1 {
                # Log and continue
                $ErrorCount++
                $Msg = "TableDiff: Error on table " + $Table[1] + " "+  $Table[2] + " with exit code $LastExitCode"
                LogWrite $Msg
                #throw $Msg
              }
            # Table differences
            2 {
                # Count Diffs
                $DiffCount++
              }     
            default {
                      $ErrorCount++
                      $Msg = "TableDiff: !!! Unanspected return value " +  $Table[1] + " "+  $Table[2] + " with exit code $LastExitCode"
                      LogWrite $Msg
                    }          
          } # end switch
        } # end Test-Path
    } 
  else 
    {
      if ($Table.Length -gt 0)
        {
         # Log skiped tables
         $Msg = "TableDiff: Skiped: " + $Table[1] + " "+  $Table[2]
         write-host $Msg
         LogWrite $Msg
        }
    } # end validate variable $table
} # end foreach table


LogWrite "Diff Count: $DiffCount, Errors: $ErrorCount "
LogWrite "==========END==============" 

if ($ErrorCount -eq 0)
  {
  Return $DiffCount
  } 
else 
  {
  Return -1
  }


Сообщение было отредактировано: 13 май 13, 21:54
13 май 13, 20:16    [14289478]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
zindur
Member

Откуда:
Сообщений: 86
ошибочка незаметно пробралась :)
это:
& $TableDiff -sourceserver $SourceServer `
....
-sourcetable $ViewPrefix + $Table[2] `
....
-destinationtable $ViewPrefix + $Table[2] 


читать как:
$ViewTableName = $ViewPrefix + $Table[2]  # new var ;)
& $TableDiff -sourceserver $SourceServer `
....
-sourcetable $ViewTableName `
....
-destinationtable $ViewTableName 
13 май 13, 20:45    [14289550]     Ответить | Цитировать Сообщить модератору
 Re: сравнение таблиц (данных) - tablediff в топку  [new]
Egorecz
Member

Откуда: Пенза
Сообщений: 27
dbForge Data Compare
[url=]http://www.devart.com/ru/dbforge/sql/datacompare/[/url]
14 май 13, 15:06    [14293287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить