2

按照本教程,我尝试使用 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 文档,它显示了完整的文档。它只是我存储在 EventLogXML 列中的数千个事件 xml 文档中的一个。

4

3 回答 3

4

我认为 XmlDataDocument 主要是为了返回单个 xml。基本上,如果您在 sql 中执行,select * from bla for xml, auto则可以使用ExecuteXmlReaderand读取它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 文档列表,每行一个文档。

于 2013-08-02T01:04:46.527 回答
2

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

我不知道您的 XML 列的结构,但是如果调用根节点MyRoot,然后调用公共子节点MySub,请尝试以下操作:

$xd.MyRoot.MySub

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

编辑

好的,这不是问题。看起来在ExecuteXmlReader使用普通select语句调用时只返回第一行是设计使然(此处的文档):

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

通过一些基本的搜索,这篇博客文章似乎最好地解释了这个问题,并提供了一种解决方法。另请参见此处

于 2013-08-01T23:06:11.900 回答
0

我可能出去吃午饭了,但难道不是因为您将数据库声明为 $SQLDBName 然后尝试在连接字符串中连接到 $Database 吗?

于 2013-08-01T21:26:58.513 回答