2

このチュートリアルに従って、 PowerShell を使用して SQL Server から xml データを取得しようとしましたが、返される要素は 1 つだけです。

実際のデータを表示するクエリは次のとおりです。

ここに画像の説明を入力

しかし、このスクリプトを実行すると、1 つの要素しか返されません。

$SQLServer = 'MYSERVER,1433'
$SQLDBName = "test"
$Query = 
@'
USE test

SELECT EventLogXML FROM ForwardedEvents

'@
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
$SqlConnection.open()    
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $Query
$SqlCmd.Connection = $SqlConnection
$xr = $SqlCmd.ExecuteXmlReader()
$xd = New-Object System.Xml.XmlDataDocument
$xd.Load($xr)
$xr.Close()
$SQLConnection.Close()
$xd

$xd要素は 1 つだけです。私は何を間違っていますか?

---編集 完全なドキュメントを明らかにする $xd.outerxml を実行することで、唯一の xml ドキュメントを確認できます。これは、私が EventLogXML 列に保存している 1000 ほどのイベント xml ドキュメントの 1 つにすぎません。

4

3 に答える 3

4

XmlDataDocument は主に単一の xml を返すためのものだと思います。基本的に、SQLで行う場合は、 andselect * from bla for xml, autoで読み取ることができます。これはあなたが望むものではありません。ExecuteXmlReaderXmlDataDocument

必要に応じてリンクした例を変更すると、次のようなものが得られます。

$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = "Server=.; Database=AdventureWorks2012;Integrated Security=true"
$con.open()

$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.CommandText = "SELECT Instructions FROM Production.ProductModel WHERE Instructions is not null"
$cmd.Connection = $con

$as = New-Object System.Data.SqlClient.SqlDataAdapter
$ds = New-Object System.Data.DataSet
$as.SelectCommand = $cmd
$as.Fill($ds);

$xmlDocs = $ds.Tables[0] | %{ [xml]$_.Instructions }

これで、xmlDocs には、行ごとに 1 つのドキュメントである xml ドキュメントのリストが含まれます。

于 2013-08-02T01:04:46.527 に答える
2

Powershell は、.Property構文を使用して探索できる便利な小さなオブジェクトに XML をラップします。だけを見ると$xd、powershell はデフォルトでルート ノードのみを表示します。

XML 列の構造はわかりませんが、ルート ノードが と呼ばれMyRoot、その後に と呼ばれる共通サブノードが続く場合はMySub、次のようにしてみてください。

$xd.MyRoot.MySub

これは、リンクされた例が使用する必要性を示しているのと同じです$xd.root.Location

編集

わかりましたので、それは問題ではありません。ExecuteXmlReader通常のselectステートメントで呼び出したときに最初の行のみを返すように設計されているようです(doc here ):

複数の行が返された場合、ExecuteXmlReader メソッドは XmlReader を最初の行の値にアタッチし、残りの結果セットを破棄します。

いくつかの基本的な検索から、このブログ投稿は問題を最もよく説明しているようで、回避策を提供します. こちらもご覧ください

于 2013-08-01T23:06:11.900 に答える
0

私は昼食に出かけるかもしれませんが、データベースを $SQLDBName として宣言し、接続文字列で $Database に接続しようとしているからではないでしょうか?

于 2013-08-01T21:26:58.513 に答える