Powershell:从SQL Server数据库中的列中检索xml数据

时间:2013-08-01 21:14:09

标签: sql-server xml powershell

关注this tutorial我尝试使用PowerShell从SQL Server检索xml数据,但我只返回一个元素。

这是一个显示实际数据的查询:

enter image description here

但是运行这个脚本我只能得到一个元素:

$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只有一个元素。我做错了什么?

---编辑 我可以通过执行$ xd.outerxml来确认它只有一个xml doc,它显示了完整的doc。它只是我存储在EventLogXML列中的大约一千个事件xml文档中的一个。

3 个答案:

答案 0 :(得分:2)

我认为XmlDataDocument主要用于返回单个xml。基本上,如果您使用sql select * 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将包含一个xml文档列表,每行一个文档。

答案 1 :(得分:1)

Powershell将XML内容包装到方便的小对象中,您可以使用.Property语法进行探索。如果你只看$xd,PowerShell默认只会显示根节点。

我不知道您的XML列的结构,但如果根节点被称为MyRoot,后面跟着名为MySub的公共子节点,请尝试这样的事情:

$xd.MyRoot.MySub

这就像链接的示例显示需要使用$xd.root.Location

一样

修改

好的,这不是问题。通过普通ExecuteXmlReader语句(doc here)调用select时,看起来只是按设计返回第一行:

  

如果返回多行,则附加ExecuteXmlReader方法   XmlReader为第一行的值,并丢弃其余部分   结果集

从一些基本的搜索中,this blog post似乎最好地解释了这个问题,并提供了一种解决方法。另请参阅here

答案 2 :(得分:0)

我可能要去吃午餐,但不是因为您将数据库声明为$ SQLDBName,然后尝试连接到您的连接字符串中的$ Database?