В приведенном ниже коде Powershell для копирования данных из Oracle в SQL Server есть способ получить данные из адаптера Oledb ($ da) в объект Bulk Copy ($ bcp) без заполнения таблицы данных ($ dt)?Может ли Powershell более эффективно передавать данные на сервер SQL, например, вместо копирования данных в таблицу данных, более непосредственного чтения из $ da в $ bcp?
$con = New-Object System.Data.OleDb.OleDbConnection($constr)
$con.open()
$cmd = New-Object system.Data.OleDb.OleDbCommand($qry,$con)
$cmd.CommandTimeout = '0'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$bcp = new-object system.data.sqlclient.Sqlbulkcopy("server=$server;database=$database;trusted_connection=true");
$bcp.DestinationTableName=$tableName;
$bcp.BulkCopyTimeout='0'
$bcp.BatchSize=75000
$bcp.WriteToServer($dt);
Я ищускорость здесь.Связанный сервер занимает 2 минуты 30, SSIS занимает около 30 секунд, и это занимает около 20 секунд.Так что мне интересно, может ли это быть больше настроено?(Размер выборки строки 75 Кб является идеальным местом для соединения оракула, поэтому я просто установил Массовую копию того же размера).(Я не застрял на BCP)
Обновление:
Я воспользовался советом Майка из комментариев ниже и удалил $ dt из уравнения
Function VAN-ELF () {
param (
[Parameter(Mandatory = $true)] [string]$tns,
[Parameter(Mandatory = $true)][string]$userName,
[Parameter(Mandatory = $true)][string]$password,
[Parameter(Mandatory = $true)][int]$fetchSize,
[Parameter(Mandatory = $true)][string]$sql,
[Parameter(Mandatory = $true)][string]$sqlServer,
[Parameter(Mandatory = $true)][string]$sqlTable,
[Parameter(Mandatory = $true)][string]$sqlDb
)
try
{
$con = New-Object System.Data.OleDb.OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=$tns;User Id=$userName;Password=$password;FetchSize=$fetchSize" ) ;
$con.open();
$cmd = New-Object system.Data.OleDb.OleDbCommand($sql,$con);
$cmd.CommandTimeout = '0';
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd);
$bcp = new-object system.data.sqlclient.Sqlbulkcopy("server=$sqlServer;database=$sqlDb;trusted_connection=true");
$bcp.DestinationTableName=$sqlTable;
$bcp.BulkCopyTimeout='0'
$bcp.WriteToServer($cmd.ExecuteReader());
}
catch
{
Write-Error ($_.Exception.ToString())
}
finally
{
if ($con.State -eq 'Open') { $con.close() }
}
}
Это бритаяеще несколько секунд от времени выполнения.