Powershell将数据从Oracle适配器传输到大容量副本适配器

时间:2019-01-31 13:48:34

标签: powershell oledb sqlbulkcopy dataadapter

在下面的Powershell代码中,用于将数据从Oracle复制到SQL Server,是否有一种方法可以将数据从Oledb适配器($ da)获取到大容量复制对象($ bcp),而无需填充数据表($ dt) )? Powershell是否可以更有效地将数据管道传输到SQL Server,例如,而不是将数据复制到数据表中,而是以更直接的方式从$ 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秒。因此,我想知道是否可以对此进行进一步调整。 (75K行获取大小是此oracle连接的最佳选择,因此我只是将Bulk副本设置为相同大小)。 (我没有卡在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() }
        }

}

这将运行时间缩短了几秒钟。

0 个答案:

没有答案