这是我的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,但仅仅因为我很幸运。必须有一种更有效的方法来做到这一点。
答案 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>
首先使用exists
(msdn)我检查,如果在text()
节点中搜索Name
,然后使用query
获取该节点。