如何在SQL Server中为多个XML节点运行查询?

时间:2019-05-26 23:24:26

标签: sql-server xml

我无法从SQL Server的XML列查询数据。从XML列中如何找到配置文件ID为222222的用户?请注意,XML中最多有500个用户。

<profiles>
  <users>
    <user>
      <profileID>000000<profileID>
      <username>abc</username>
    </user>
    <user>
      <profileID>111111<profileID>
      <username>def</username>
    </user>
    <user>
      <profileID>222222<profileID>
      <username>jhi</username>
    </user>
  </users>  
</profiles>

1 个答案:

答案 0 :(得分:0)

首先:由于缺少<profileID>的结束标记,您的XML无效。

要让一位专用用户脱离XML,您可以尝试以下操作:

DECLARE @XML xml = 
N'<profiles>
    <users>
    <user>
        <profileID>000000</profileID>
        <username>abc</username>
    </user>
    <user>
        <profileID>111111</profileID>
        <username>def</username>
    </user>
    <user>
        <profileID>222222</profileID>
        <username>jhi</username>
    </user>
    </users>  
</profiles>';

-我们声明个人资料ID

DECLARE @userId INT=222222;

-此查询将仅返回给定ID的单个配置文件

SELECT @XML.query('/profiles/users/user[profileID/text()=sql:variable("@userId")]');

-并且此查询将在此节点内返回<username>

SELECT @XML.query('/profiles/users/user[profileID/text()=sql:variable("@userId")]').value('(user/username/text())[1]','nvarchar(max)');

主要思想称为 XQuery谓词。您可以阅读为

  • 深入研究个人资料,深入用户,然后深入<user>,但我们只需要嵌套profileID等于我们的搜索值的节点。
  • 获取此个人资料并阅读其<username>