.
При работе с 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.