Загрузить набор данных в сценарий SQL (в powershell) - PullRequest
1 голос
/ 11 февраля 2011

Я хотел бы извлечь большой набор данных из базы данных сервера SQL на одном сервере, а затем включить этот набор данных в другую базу данных на другом сервере.Поскольку сервер ссылок недоступен, я попробовал сценарий powershell и хотел бы что-то вроде:

$connection = New-Object System.Data.SqlClient.SqlConnection
$command = New-Object System.Data.SqlClient.SqlCommand
... etc for SqlDataAdapter as well
$adapter.Fill($dataset1)

$connection2 = ... (to a database on another server)
$command2 = ...
Load $dataset1 into $command2
$command2.Fill($dataset2)

Как загрузить набор данных 1 в команду 2?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Вы уверены, что хотите сохранить весь набор данных в памяти?

Если вы просто хотите скопировать результат запроса в другую таблицу, лучше использовать средство чтения данных, чтобы избежать нехватки памяти.

# 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 не применяется.

1 голос
/ 11 февраля 2011

Задумывались ли вы о классе SQLBulkCopy? Здесь - это функция powershell, которая использует ее для передачи данных из одного набора данных в другое соединение SQL.

...