s-s-rS:解析来自具有 XML 列的 SQL Server 查询的结果

Posted

技术标签:

【中文标题】s-s-rS:解析来自具有 XML 列的 SQL Server 查询的结果【英文标题】:s-s-rS: Parse results from a SQL Server query that has an XML Column 【发布时间】:2011-03-25 18:28:03 【问题描述】:

我正在查看以下查询:

SELECT  txt.ID, txt.Rev, txt.Words,
        flds.ReferenceName
FROM    Fields flds (NOLOCK) 
        JOIN WorkItemLongTexts txt (NOLOCK) 
            ON flds.FldID = txt.FldID
WHERE   flds.ReferenceName = 'Microsoft.VSTS.TCM.Steps'

第三列(txt.Words)返回这个值:

<steps id="0" last="3">
  <step id="1" type="ValidateStep">
    <parameterizedString>
      <text>Step 1</text>
    </parameterizedString>
    <parameterizedString>
      <text>Result 1</text>
    </parameterizedString>
    <description />
  </step>
  <step id="2" type="ValidateStep">
    <parameterizedString>
      <text>Step 2</text>
    </parameterizedString>
    <parameterizedString>
      <text>Result 2</text>
    </parameterizedString>
    <description />
  </step>      
</steps>

很明显,我可以使用 .net 客户端应用程序轻松解析这个问题。不过,我想将此查询直接放入 s-s-rS 报告中。

有没有办法将此列中的数据导入 s-s-rS 可消耗数据集,如下所示: 1 |验证步骤 |第 1 步 |结果 1 2 |验证步骤 |第 2 步 |结果2

(或类似的)

【问题讨论】:

【参考方案1】:

您可以使用TSQL's OpenXML 功能从您的 xml 数据中获取行集,但是您需要元素和属性的组合,所以这将是一些工作。

【讨论】:

【参考方案2】:

我对@9​​87654321@ 一无所知,但这是我在常规查询中的做法。也许这是你可以使用的东西。 我已经简化了您的示例并改用表变量。我假设 XMLColumn 的数据类型为 xml

-- Sample table
declare @T table (ID int, XMLColumn xml)

-- Insert sample data
insert into @T values
(1,'
<steps id="0" last="3">
  <step id="1" type="ValidateStep">
    <parameterizedString>
      <text>Step 1</text>
    </parameterizedString>
    <parameterizedString>
      <text>Result 1</text>
    </parameterizedString>
    <description />
  </step>
  <step id="2" type="ValidateStep">
    <parameterizedString>
      <text>Step 2</text>
    </parameterizedString>
    <parameterizedString>
      <text>Result 2</text>
    </parameterizedString>
    <description />
  </step>      
</steps>')

-- Duplcate first row
insert into @T 
select 2, XMLColumn
from @T


-- The query
select
  ID as RowID,
  s.value('@id', 'int') as ID, 
  s.value('@type', 'varchar(15)') as [Type],
  s.value('parameterizedString[1]/text[1]', 'varchar(15)') as Step, 
  s.value('parameterizedString[2]/text[1]', 'varchar(15)') as Result 
from @T

结果

RowID       ID          Type            Step            Result
----------- ----------- --------------- --------------- ---------------
1           1           ValidateStep    Step 1          Result 1
1           2           ValidateStep    Step 2          Result 2
2           1           ValidateStep    Step 1          Result 1
2           2           ValidateStep    Step 2          Result 2

【讨论】:

以上是关于s-s-rS:解析来自具有 XML 列的 SQL Server 查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS:具有返回同名列的存储过程的报告服务

s-s-rS 2005 查找具有最大值的列的名称

当 XPATH 不存在时,s-s-rS 返回具有一行的数据集

在 Oracle SQL 中解析具有未知名称空间的 XML

count(*) 来自 2 个具有相同列的表

在 PL/SQL 过程中解析具有名称空间的 XML 的未知数量节点?