关注this tutorial我尝试使用PowerShell从SQL Server检索xml数据,但我只返回一个元素。
这是一个显示实际数据的查询:
但是运行这个脚本我只能得到一个元素:
$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文档中的一个。
答案 0 :(得分:2)
我认为XmlDataDocument主要用于返回单个xml。基本上,如果您使用sql select * from bla for xml, auto
,那么您可以使用ExecuteXmlReader
和XmlDataDocument
来阅读它。这不是你想要的。
修改与您的需求相关联的示例,我们会得到一些像:
$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?