.

При работе с PowerShell иногда требуется загрузить данные из некоторого источника в SQL Server для последующего анализа. Это могут быть данные статистики сервера или другая информация, которую полезно иметь в таблице базы данных.

ADO.NET предусматривает возможность массовой загрузки данных с помощью объекта SqlBulkCopy. В отношении работы с объектом SqlBulkCopy существует два важных требования. Во-первых, целевая таблица должна точно соответствовать помещаемым в нее данным, то есть не должно быть лишних столбцов, даже при наличии ограничений по идентификатору или ограничений по умолчанию. Во-вторых, исходные данные должны быть в форме объекта ADO.NET DataTable.

Функция Out-DataTable

Некоторое время назад Марк Ван Орсоу, специалист по PowerShell и обладатель звания MVP, создал функцию под названием Out-DataTable (http://cleancode.sourceforge.net/api/powershell/CleanCode/SqlTools/Out-DataTable.html) и опубликовал ее в своем блоге. Исходная ссылка с тех пор прекратила существование, но еще один MVP и специалист по PowerShell, Чед Миллер, усовершенствовал эту функцию и сделал ее общедоступной на сайте SourceForge.net.

Данная функция преобразует любой объект PowerShell в объект DataTable. Исходный объект передается функции как входной аргумент, а результат исполнения присваивается переменной, представляющей собой объект DataTable.

Предположим, что требуется извлечь данные о размере и свободном пространстве каждого логического диска на сервере и загрузить их в SQL Server для последующего анализа. Для сбора информации о дисках можно воспользоваться запросами инструментария управления Windows (Windows Management Instrumentation), выбрав свойства «имя», «размер» и «свободное пространство». Чтобы фиксировать текущую дату и время, можно создать хеш-таблицу и добавить ее к свойствам создаваемого объекта, чтобы объект PowerShell обладал всеми избранными свойствами.

$logdsk = gwmi -query «select * from Win32_LogicalDisk where DriveType=3» -computername 'WS12SQL' | select @{Name=«DiskDTM»; Expression={get-date}}, Name, FreeSpace, Size

В SQL Server создаем таблицу с аналогичными четырьмя столбцами на T-SQL.

USE ServerAnalysis
GO
CREATE TABLE dbo.LogicalDisk (
[DiskDTM] datetime,
[Name] varchar(50),
[FreeSpace] bigint,
[Size] bigint
)
GO

Созданный объект PowerShell, содержащий требуемые данные, передаем по конвейеру функции Out-DataTable, назначив результаты ее исполнения переменной, которая будет подана на вход объекта SqlBulkCopy.

$dtable = $logdsk | Out-DataTable

Затем открываем подключение к SQL Server для загрузки данных. Для создания подключения к SQL Server используем объект ADO.NET SqlConnection. Подключение открываем сразу же после того, как оно создано.

$cn = new-object System.Data.SqlClient.SqlConnection(«Data Source=WS12SQL;Integrated Security=SSPI;Initial Catalog=ServerAnalysis»);
$cn.Open()

Создание объекта SqlBulkCopy

С помощью этого подключения создаем объект SqlBulkCopy. Свойство DestinationTableName объекта SqlBulkCopy устанавливаем в качестве имени нашей таблицы и осуществляем загрузку данных в SQL Server, используя метод WriteToServer, для которого наш объект DataTable выступает в качестве аргумента. Выполнив загрузку, закрываем подключение.

$bc = new-object («System.Data.SqlClient.SqlBulkCopy») $cn
$bc.DestinationTableName = «dbo.LogicalDisk»
$bc.WriteToServer($dtable)
$cn.Close()

Этот процесс значительно упрощает перемещение больших объемов данных в SQL Server.