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

Sql XML返回检查多个节点的值,sql,sql-server,xml,xpath,Sql,Sql Server,Xml,Xpath,这是我的xml <Configuration> <Name>EscalatedSubscribers</Name> <Role>Configuration</Role> <UISettings> <Control> <Name>SubscriberSelector</Name> <Type>Configurat

这是我的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>
返回所需的完整节点,我正在检查该节点是否与“%ganderson%”类似

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

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

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

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

结果:

<Name Type="WS">evalone</Name>
<Name Type="WS">lmcswain</Name>
结果:

<Name Type="WS">jbranham</Name>
<Name Type="WS">jbranham</Name>
<Name Type="WS">jbranham</Name>
jbranham
杰布拉纳姆
杰布拉纳姆

首先使用
exists
()检查
Name
节点中是否存在搜索到的
text()
,然后使用
query
获取该节点。

我想我的问题是,哪里有text()=sql:variable(),我还有什么其他选项。我试图从另一个表中提取一列。因此,正如您所看到的,您也可以使用
sql:column(“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>