Вы уверены, что хотите сохранить весь набор данных в памяти?
Если вы просто хотите скопировать результат запроса в другую таблицу, лучше использовать средство чтения данных, чтобы избежать нехватки памяти.
# cf. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
$SourceConnectionString = "Data Source=localhost;Initial Catalog=source_db;Integrated Security=True"
$DestinationConnectionString = "Data Source=localhost;Initial Catalog=Destination_db;Integrated Security=True"
$tableName = "MyTable"
$sql = "select * FROM $tableName"
$sourceConnection = New-Object System.Data.SqlClient.SQLConnection($ConnectionString)
$sourceConnection.open()
$commandSourceData = New-Object system.Data.SqlClient.SqlCommand($sql,$sourceConnection)
#$commandSourceData .CommandTimeout = '300'
ps 'powershell_ise'
$reader = $commandSourceData.ExecuteReader()
ps 'powershell_ise'
try
{
$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $DestinationConnectionString
$bulkCopy.DestinationTableName = $tableName
$bulkCopy.BatchSize = 5000
$bulkCopy.BulkCopyTimeout = 0
$bulkCopy.WriteToServer($reader)
}
catch
{
$ex = $_.Exception
Write-Host "Write-DataTable$($connectionName):$ex.Message"
}
finally
{
$reader.close()
}
Edit:
После прочтения комментария Майка о том, что PowerShell, возможно, развертывает объект устройства чтения данных, я повторил попытку замены кода.
$sql = "select * FROM $tableName"
по
$sql = "select * FROM $tableName union all select * FROM $tableName union all select * FROM $tableName union all select * FROM $tableName union all select * FROM $tableName "
Это все еще работало, и у меня не было исключения из нехватки памяти в
$reader = $commandSourceData.ExecuteReader()
Пока я не увижу проблемы, у меня нет причин пробовать вариацию Майка.
2-е редактирование:
Я изменил код, добавив
ps 'powershell_ise'
до и после
$reader = $commandSourceData.ExecuteReader()
Я не наблюдаю никаких изменений в использовании памяти, и поэтому я пришел к выводу, что предположение Майкла о развертывании PowerShell объекта datareader не применяется.