XMLエクスポートをSQL Serverデータベースに渡す非常に簡単なコードを作成しました。すべてが機能し、データは必要に応じてテーブルに表示されます。PowerShell XML to SQL Server
しかし、私はリスト(約120k)から1つのレコードでテストしたところ、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ファイルを解析していますか?あなたは、単一のxmlファイルに120K個のレコードがあると言っていますか?おそらくxmlスニペットが役に立ちます。 –
ファイルの読み込みには5秒かかります。選択範囲はそれぞれ数秒です。INSERTはかなり高速です –
xmlのスニペットを追加できますか? xml解析の量を減らし、パフォーマンスを向上させることは可能かもしれません。 –