Sql XML返回检查多个节点的值

时间:2014-07-02 18:33:14

标签: sql sql-server xml xpath

这是我的xml

  <Configuration>
    <Name>EscalatedSubscribers</Name>
    <Role>Configuration</Role>
    <UISettings>
      <Control>
       <Name>SubscriberSelector</Name>
       <Type>Configuration</Type>
       <DisplayItem>Workspaces</DisplayItem>
      </Control>
    </UISettings>
    <Values>
     <Required>
      <Name Type="WS">ganderson</Name>
      <Name Type="WS">mhoffmann</Name>
      <Name Type="WS">lmcswain</Name>
      <Name Type="WS">jbranham</Name>
      <Name Type="WS">gsimpson</Name>
      <Name Type="WS">jbennett</Name>
      <Name Type="WS">bdrum</Name>
      <Name Type="WS">mtrott</Name>
      <Name Type="WS">acannon</Name>
      <Name Type="WS">dgantt</Name>
      <Name Type="WS">evalone</Name>
      <Name Type="WS">flyons</Name>
      <Name Type="WS">saheavner</Name>
    </Required>
   </Values>
  </Configuration>

我的数据集有一个ID,一个名称和一个xml字段。目标是在每个名称的xml中查询,如果用户“ganderson”,则需要查询。是name节点的值,返回该名称节点。

 SELECT p.Tag.query('(/Configuration/Values/Required/*)')

返回必需的fulle节点,我正在检查节点是否像LIKE&#39;%ganderson%&#39;

 SELECT p.Tag.value('(/Configuration/Values/Required[1]','varchar(max)') as varchar(max) )

返回第一个用户,这是ganderson,但仅仅因为我很幸运。必须有一种更有效的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以通过变量或列来检查此名称是否存在于xml列中。

首先我创建了表并添加了一些数据(使用了为xmlData列编写的相同xml):

DECLARE @xmlTable TABLE (ID INT, Name VARCHAR(200), xmlData XML)

INSERT INTO @xmlTable SELECT 1, 'evalone', <xmlData>
INSERT INTO @xmlTable SELECT 2, 'lmcswain', <xmlData>
INSERT INTO @xmlTable SELECT 3, '22222', <xmlData>

然后您可以在xmlData列中找到表中的Name,如下所示:

SELECT xmldata.query('(/Configuration/Values/Required/Name[text()=sql:column("name")])')
FROM @xmlTable
WHERE xmldata.exist('/Configuration/Values/Required/Name[text()=sql:column("name")]') = 1

结果:

<Name Type="WS">evalone</Name>
<Name Type="WS">lmcswain</Name>

或者您可以从变量中搜索一些文本:

DECLARE @id VARCHAR(200) = 'jbranham';

SELECT xmldata.query('(/Configuration/Values/Required/Name[text()=sql:variable("@id")])')
FROM @xmlTable
WHERE xmldata.exist('/Configuration/Values/Required/Name[text()=sql:variable("@id")]') = 1

结果:

<Name Type="WS">jbranham</Name>
<Name Type="WS">jbranham</Name>
<Name Type="WS">jbranham</Name>

首先使用existsmsdn)我检查,如果在text()节点中搜索Name,然后使用query获取该节点。