2011-12-07 70 views
0

我在查詢索引使用統計信息的powershell中有例行程序。該查詢針對服務器上的每個數據庫運行並抽出一個xml片段。我試圖在一個XML文件中獲得所有結果。除了將節點附加到現有的xml文件的所有代碼都可以工作。我試過AppendNode和ImportNode沒有結果。這裏是不工作使用PowerShell將節點添加到xml文件

$xml = Invoke-Sqlcmd -Query... | ConvertTo-Xml 

$file_xml = [xml](Get-Content $target_file) 
$index_nodes = $xml.SelectNodes("/Objects/Object") 
foreach($index_node in $index_nodes){ 
    $file_xml.ImportNode($index_node, $true)    
}    
$file_xml.Save($target_file) 

回答

0

我有麻煩做在PowerShell中XML的工作類似的事情的片段。在大多數情況下,我認爲它是我正在使用的文件的XML格式,並不像PowerShell。我可以毫無錯誤地運行這些命令,查看我的XML文件,並且沒有添加任何內容。我通常最終將文件視爲普通文本文件。然而...

對於您的實例,我認爲您可能想重新評估您如何查詢信息。如果您使用的是sys.dm_db_index_usage_stats,則表示它針對每個數據庫運行,您可以針對實例上任何數據庫中使用的每個索引獲取一個查詢。其中金佰利Tripp提供了一個可以使用的快速查詢here(這是下面使用的腳本)。

這反過來會爲您提供一個XML文件:


$indexStats = @" 
SELECT getdate() AS RunTime 
, DB_NAME(i.database_id) as DatabaseName 
, OBJECT_NAME(i.object_id, i.database_id) as ObjectName 
, i.user_seeks 
, i.last_user_seek 
, i.user_scans 
, i.last_user_scan 
, i.user_lookups 
, i.last_user_lookup 
FROM sys.dm_db_index_usage_stats AS i 
WHERE object_id > 100 
"@ 

$xml = Invoke-Sqlcmd -ServerInstance -Database master -Query $indexStats | 
ConvertTo-Xml 

我知道你可能有一個原因,這樣做對環境中的每個單獨的數據庫,但是這似乎是更高效,更會更少的代碼跟上你的腳本。

0

試試這個。要複製你的XML結構,我使用ConvertTo-XML來創建兩個xml對象。第二個對象附加到第一個對象並保存到磁盤。

$xml1 = dir -path C:\Users\andy | ? {$_.PsIsContainer} | ConvertTo-Xml 
$xml2 = dir -path C:\ | ? {$_.PsIsContainer} | ConvertTo-Xml 

$objectNodes = $xml2.SelectNodes('/Objects/Object') 
if ($objectNodes) { 
    foreach ($objectNode in $objectNodes) { 
     $importedNode = $xml1.ImportNode($objectNode, $true) 
     $xml1.DocumentElement.AppendChild($importedNode) | Out-Null 
    } 
} 

$xml1.Save("C:\Users\andy\Desktop\output.xml") 
相關問題