Передача данных Powershell из адаптера Oracle в адаптер массового копирования - PullRequest
0 голосов
/ 31 января 2019

В приведенном ниже коде 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() }
        }

}

Это бритаяеще несколько секунд от времени выполнения.

...