Aleksey 的个人资料Automatisation of our sy...日志列表网络 工具 帮助

日志


2008/10/16

Powershell and MS SQL 2005 нет ничего проще

Tah blog Tags: ,

Как по мне, то Powershell очень удобен для обработки различного рода информации, возможность работы с csv и xml файлами, а также представление всевозможных данных в виде обьектов - выгодно отличает его от WSH с такими весьма популярными скриптовыми языками программирования как VBScript и JScript.

Но для менявся красота в какой-то момент потерялась при работе с большими обьемами данных, невероятные задержки при необходимости многократного поиска различных данных в файлах или сведение данных из двух файлов по какому-либо признаку, натолкнуло на мысль, что а было бы хорошо использовать для этих целей уже существующие решения, как SQL запросы и базы данных :-)  Не изобретая колеса, было решено использовать MS SQL 2005 сервер под свои нужды и скажу, что я удивился тому удобству что я получил в итоге.

Рассмотрим пример, у нас есть две таблички

CREATE TABLE [dbo].[computers](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](256) NOT NULL,
    [domain] [int] IDENTITY(1,1) NOT NULL,
    [status] [bit] NOT NULL
)
CREATE TABLE [dbo].[domains](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [domainName] [nvarchar](256) NOT NULL
)

Где-то в скрипте получая данные о компьютерах в сети(задача выдуманная на ходу(не вините, что не брал список компов с AD ;-)) необходимо заполнить эти таблицы, с одним условием, что одинаковые записи об одном и том-же компьютере в таблицу computers попадать не будут.

 

Для начала опишем функцию которая будет осуществлять подключение к MSSQL серверу, получив через параметрыстроку соединния(connection string),  а также SQL запрос который необходимо исполнить.

#connection string
$constr = @"
Server=COMP1\SQLEXPRESS;Database=inventar;
Integrated Security=True
"@;

function sqlquery ([string]$constr,$query) {
   $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
   $SqlConnection.ConnectionString = $constr
   $DataSet = New-Object System.Data.DataSet
   $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
   $SqlCmd.CommandText = $query
   $SqlCmd.Connection = $SqlConnection
   $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
   $SqlAdapter.SelectCommand = $SqlCmd
   $res = $SqlAdapter.Fill($DataSet)
   $SqlConnection.Close()
   if (-not ( $query -match "INSERT" )) {$DataSet.Tables[0]}
       else { $res }
}

Так как тип возвращаемых данных для INSERT запроса отличается от остальных, пришлось идти на небольшое ухищерение и в зависимости от того, найдена ли строка с INSERT'ом внутри запроса или нет - выдавать различного типа  результат.

$computer = "ada1"
$domain = "DoD"
$state = $true

$query =@"
SELECT name, domainName.domains  FROM computers
INNER JOIN domains
ON computers.domain = domains.id
WHERE (computers.name = $computer)
AND (domainName.domains = $domain)
"@;
$result = sqlquery "$constr" "$query"

if ($result -eq $null) {
   #search for domain id in domains table
   $get_domain = "SELECT * FROM domains WHERE domainName='$domain'"
   $result = sqlquery "$constr" "$get_domain"
   $domain_id = $result.id
 
   #insert computer in database
   $query
=@"INSERT INTO computers (name,domain,status)
   VALUES ('$computer','$domain_id','$status');
   "@;
   $res = sqlquery "$constr" "$query"
   Write-Output "Result: added $res"
}
else {Write-Output "Result: computer $computer/$domain already exist in database"}

(В данном примере все возможные домены уже находятся в табличке domains)

Пример я считаю достаточно исчерпывающий, ну а теперь - пользуемся :-)

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://tah-manof.spaces.live.com/blog/cns!A8AFC01F30572338!211.trak
引用此项的网络日志