【问题标题】:Powershell: Retrieve xml data from column in SQL Server databasePowershell:从 SQL Server 数据库中的列中检索 xml 数据
【发布时间】:2013-08-03 00:05:42
【问题描述】:

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 文档,它显示了完整的文档。它只是我存储在 EventLogXML 列中的数千个事件 xml 文档中的一个。

【问题讨论】:

  • 当然,每行有一个文档。由于您只创建一个文档,因此您只从其中的一行中获取信息也就不足为奇了。您是否期望以某种方式将所有行中的所有这些单独的 xml 组合在一起?如果有,怎么做?
  • 嗯,我在这里缺少一些基本的东西。我认为 $xd 应该是一个包含所有行的对象。它不是?我想返回列中可以循环的所有 xml 对象的数组。我以前从未像这样使用过 sql,所以我想我误解了脚本实际上在做什么。
  • 哎呀,对不起,我的错。我将XmlDataDocument 误读为XmlDocument。请忽略我之前的评论。

标签: sql-server xml powershell


【解决方案1】:

我认为 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 文档列表,每行一个文档。

【讨论】:

  • 这就是我想做的。我使用 XmlDataDocument 的唯一原因是在将完整的“SELECT * FROM TABLE”查询分配给单个变量时遇到了一个奇怪的错误。我的问题应该解释这是我最初的问题。好吧,我只是尝试使用“新”变量来存储数据集并且它起作用了,哎呀。所有这一切都是因为我在尝试使用它来存储数据集之前不小心将我正在使用的变量转换为某种奇怪的类型。
【解决方案2】:

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

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

$xd.MyRoot.MySub

正如链接的示例显示需要使用$xd.root.Location

编辑

好的,这不是问题所在。使用普通的select 语句(文档here)调用ExecuteXmlReader 时,只返回第一行似乎是设计使然:

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

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

【讨论】:

  • 非常感谢您的回复,但事实并非如此。它实际上只是一个 xml 文档。我可以通过 $xd.outerxml 来确认这一点,它显示了完整的元素。我会将此信息作为编辑添加到我的帖子中。
【解决方案3】:

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

【讨论】:

  • 哦,不!甚至没有注意到这一点。我明天在工作和测试中纠正这个问题。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2014-01-05
  • 1970-01-01
  • 2023-03-06
  • 2012-12-19
相关资源
最近更新 更多