Я написал очень простой код для передачи моего экспорта XML в базу данных SQL Server. Все работает, и данные отображаются в таблице так, как должны.PowerShell XML to SQL Server
Однако, когда я тестировал одну запись из списка (около 120 тыс. Из них), мне потребовалось около 20 секунд. Это должен быть лучший способ передать информацию. Я приложил код ниже для людей, которые знают, как это сделать. Я думаю, мой код очень прост и работает с принципами и не нужен правильный путь.
Поскольку каждый день я создаю XML, очень важно, чтобы я ускорил эту процедуру. Поскольку я никогда не делал этого раньше и не желал учиться, любые комментарии/ссылки очень приветствуются. Спасибо за чужое время заранее.
$sqlserver="test"
$db="test"
$table="dbo.test"
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=$sqlserver; Database=$db; Integrated Security = True;"
$conn.Open()
$cmd=$conn.CreateCommand()
[xml]$xmllog="<logroot>$(get-content("I:\somefile.xml"))</logroot>"
$idevent=$xmllog.logroot.Event.system.eventid[0]
$levelcode=$xmllog.logroot.Event.system.level[0]
$times=$xmllog.logroot.Event.system.timecreated.systemtime[0]
$computers=$xmllog.logroot.Event.system.computer[0]
$subUser=$xmllog.logroot.Event.selectsinglenode("//*[@Name='SubjectUserName']")[0].'#text'
$subdomain=$xmllog.logroot.Event.selectsinglenode("//*[@Name='SubjectDomainName']")[0].'#text'
$targUser=$xmllog.logroot.Event.selectsinglenode("//*[@Name='TargetUserName']")[0].'#text'
$targetDom=$xmllog.logroot.Event.selectsinglenode("//*[@Name='TargetDomainName']")[0].'#text'
$logontypes=$xmllog.logroot.Event.selectsinglenode("//*[@Name='LogonType']")[0].'#text'
$logonproc=$xmllog.logroot.Event.selectsinglenode("//*[@Name='LogonProcessName']")[0].'#text'
$workstation=$xmllog.logroot.Event.selectsinglenode("//*[@Name='WorkstationName']")[0].'#text'
$ipaddress=$xmllog.logroot.Event.selectsinglenode("//*[@Name='IpAddress']")[0].'#text'
$cmd.CommandText="insert dbo.test values (1, '$idevent', '$levelcode', '$times','$computers', '$subUser', '$subdomain','$targUser', '$targetDom', '$logontypes', '$logonproc', '$workstation','$ipaddress')"
$cmd.ExecuteNonQuery()
$conn.Close()
Это 'INSERT', который занимает 20 секунд или разбор XML-файла? Вы говорите, что у вас есть 120K отдельных записей в одном XML-файле? Возможно, поможет xml-фрагмент. –
Загрузка файла занимает 5 секунд, selectsinglenodes - это несколько секунд, когда INSERT довольно быстро –
Можете ли вы добавить фрагмент xml? Возможно, будет уменьшено количество разборок xml и улучшена производительность. –