Import/Export данных с помощью Powershell

igas
Дата: 15.06.2011 11:29:39
как выполнить Import/Export данных БД в аналогичную БД но на другом сервере с помощью Powershell?
igas
Дата: 16.06.2011 16:45:20
Andrey Sribnyak,
спасибо за ссылку. В данной программе я явно задаю таблицу. как сделать так чтобы перебор таблиц был автоматическим:
  #requires -version 2.0   
  Param ( 
      [parameter(Mandatory = $true)]  
      [string] $SrcServer, 
      [parameter(Mandatory = $true)]  
      [string] $SrcDatabase, 
      [parameter(Mandatory = $true)]  
      [string] $SrcTable,
      [parameter(Mandatory = $true)]  
      [string] $DestServer,  
      [string] $DestDatabase,
      [string] $DestTable, 
      [switch] $Truncate 
  ) 
 
  Function ConnectionString([string] $ServerName, [string] $DbName)  
  { 
    "Data Source=$ServerName;Initial Catalog=$DbName;Integrated Security=True;" 
  } 
  If ($DestDatabase.Length –eq 0) { 
    $DestDatabase = $SrcDatabase 
  } 
 
  If ($DestTable.Length –eq 0) { 
    $DestTable = $SrcTable 
  } 
 
  If ($Truncate) {  
    $TruncateSql = "TRUNCATE TABLE " + $DestTable 
    Sqlcmd -S $DestServer -d $DestDatabase -Q $TruncateSql 
  } 
 
  $SrcConnStr = ConnectionString $SrcServer $SrcDatabase 
  $SrcConn  = New-Object System.Data.SqlClient.SQLConnection($SrcConnStr) 
  $CmdText = "SELECT * FROM " + $SrcTable 
  $SqlCommand = New-Object system.Data.SqlClient.SqlCommand($CmdText, $SrcConn)   
  $SrcConn.Open() 
  [System.Data.SqlClient.SqlDataReader] $SqlReader = $SqlCommand.ExecuteReader() 
 
  Try 
  { 
    $DestConnStr = ConnectionString $DestServer $DestDatabase 
    $bulkCopy = New-Object Data.SqlClient.SqlBulkCopy($DestConnStr, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity) 
    $bulkCopy.DestinationTableName = $DestTable 
    $bulkCopy.WriteToServer($sqlReader) 
  } 
  Catch [System.Exception] 
  { 
    $ex = $_.Exception 
    Write-Host $ex.Message 
  } 
  Finally 
  { 
    Write-Host "Table $SrcTable in $SrcDatabase database on $SrcServer has been copied to table $DestTable in $DestDatabase database on $DestServer" 
    $SqlReader.close() 
    $SrcConn.Close() 
    $SrcConn.Dispose() 
    $bulkCopy.Close() 
  } 
igas
Дата: 17.06.2011 20:00:51
в Т-SQL команда:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
можно ли через команду в Powershell ExecuteNonQuery() как-нибудь использовать выбранные таблицы?
Вот так можно
Invoke-Sqlcmd "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES" | out-file -filepath C:\list_tables.txt
но это только работает в SQL Powershell
igas
Дата: 17.06.2011 20:38:13
И как извлечь названия таблиц из этого файла? Названия в текстовом файле располагаются через пустую строку
Maxx
Дата: 17.06.2011 22:01:06
И все таки ,а зачем для такой задаи повершелл то ?
Andrey Sribnyak
Дата: 17.06.2011 22:32:26
igas
в Т-SQL команда:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
можно ли через команду в Powershell ExecuteNonQuery() как-нибудь использовать выбранные таблицы?
Вот так можно
Invoke-Sqlcmd "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES" | out-file -filepath C:\list_tables.txt
но это только работает в SQL Powershell


все можно... например, как выбрать имена баз данных и потом их использовать


$Query = "select name  from sys.databases where database_id >4"


# Создаём соединение 
$SQLConnection = New-Object System.Data.SqlClient.SqlConnection("Data Source=(local);Integrated Security=SSPI") 

# Создаем SQL команду, используя наш запрос и созданное соединение 
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($Query, $SQLConnection) 

# Открываем соединение 
$SQLConnection.Open() 

# Выполняем…. 
$SQLAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($SQLCommand)
$DataSet = New-Object System.Data.DataSet;
$SQLAdapter.Fill($DataSet);
$DataTable=New-Object System.Data.DataTable
$DataTable=$DataSet.Tables[0]


# Закрываем соединение 
$SQLConnection.Close() 

$dbName=$DataTable.DefaultView

foreach ($db in $dbName)
{
	#Здесь вызываешь для каждой бызы свой скрипт соединения с этой базой...
	$db.Name

}

Mnior
Дата: 17.06.2011 22:34:38
Незнание базовых основ PowerShell и повальное процедурномыслие, которое уже в печёнках, блин.
Куча долбаных переменных, долбаных IF / WHILE / FOREACH. И миллиарды километров кода. Это не говоря о каких-то нафиг создаваемых файлах (кроме логов).

# $SqlCommand = New-Object System.Data.SqlClient.SqlCommand("SELECT * FROM <TABLE>", $SrcConn);
# $SrcConn.Open();
Invoke-Sqlcmd -Q "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES" -S "Server" -d "DataBase" -E | %{
  "TRUNCATE TABLE " + $_.TABLE_SCHEMA + "." + $_.TABLE_NAME + "; ";
  # $SqlCommand.CommandText = "SELECT * FROM " + $_.TABLE_SCHEMA + "." + $_.TABLE_NAME + "; ";
  # try { $SqlReader = $SqlCommand.ExecuteReader(); .... } catch { ...
} | Out-String | Invoke-Sqlcmd -S "Server" -d "DataBase" -E;
Но я бы посоветовал бросить это и заюзать нативные средства: sqlps или подключить SQL оснастку к ps.
# Если не через sqlps, а тупо ps, то:
# add-pssnapin SqlServerCmdletSnapin100;
# add-pssnapin SqlServerProviderSnapin100;

# Перейти в нужное место
# cd SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDataBase
cd SQLSERVER:\SQL\LOCALHOST\DEFAULT\Databases\tempdb;
# По всем объектам (Get-ChildItem)
gci .\Tables | %{
  # Bla-Bla-Bla
}
# Или сразу (Get-Item) без cd:
# (gi SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDataBase\Tables\*) | %{ ... }
# Получить все свойства объекта можно через gm (Get-Member)
Но ещё можно сохранить стандартный Import-Export пакет. А потом тупо его вызвать подставив нужные параметры (имена таблицы, базы, интанса). Программа dtexec

Справка по Cmdlet Windows PowerShell.
Mnior
Дата: 17.06.2011 22:57:00
Maxx
И все таки ,а зачем для такой задаи повершелл то ?
1. Тема так называется. :)
2. Да и задача не была описана.

Представьте, что при push-е очередной ревизии в репозиторий запускается ps скрипты авто-форматеров, check-ов, авто-билдов и затем авто-тесты, требующих определённые данные в таблах на временно созданной базе.
Хотя в данном случае, лучше подымать базу из бэкапа.

Вот можно и сэкономить - скриптингом.