You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中XQuery嵌套两个XML变量查询报错,如何实现数据合并?

问题分析与解决

你遇到的错误是因为在XQuery语句里错误地尝试直接调用SQL变量的query()方法,XQuery上下文无法识别这种SQL语法,正确做法是使用sql:variable()函数引用另一个XML变量,再进行节点匹配。

修正后的代码

DECLARE @inforKhoa XML;
SET @inforKhoa = (SELECT * 
                  FROM KhoaHoc
                  FOR XML AUTO);

DECLARE @inforsv XML;
SET @inforsv = (SELECT * 
                FROM SinhVien
                FOR XML AUTO);

DECLARE @merge XML;
SET @merge = @inforsv.query('
    for $i in //SinhVien
    let $khoa := sql:variable("@inforKhoa")//KhoaHoc[@MaKhoaHoc = $i/@MaKhoaHoc]
    return <INFOR>{$i, $khoa}</INFOR>
');

PRINT CAST(@merge AS NVARCHAR(MAX));

代码说明

  • 引用外部XML变量:用sql:variable("@inforKhoa")在XQuery中获取SQL层面的@inforKhoa变量,这是跨SQL和XQuery上下文引用变量的标准方式。
  • 节点关联:直接在XPath中通过@MaKhoaHoc = $i/@MaKhoaHoc匹配学生对应的课程节点,无需额外嵌套循环,简化逻辑。
  • 合并节点:将匹配到的<SinhVien>和对应的<KhoaHoc>节点包裹到<INFOR>节点中,完成数据合并。

执行后会输出如下结果:

<INFOR>
  <SinhVien MSSV="1" TenSV="Sang" MaKhoaHoc="1" />
  <KhoaHoc MaKhoaHoc="1" TenKhoaHoc="Mang May Tinh Truyen Thong" />
</INFOR>
<INFOR>
  <SinhVien MSSV="2" TenSV="Duy" MaKhoaHoc="2" />
  <KhoaHoc MaKhoaHoc="2" TenKhoaHoc="Khoa Hoc May Tinh" />
</INFOR>
<INFOR>
  <SinhVien MSSV="3" TenSV="Sa" MaKhoaHoc="3" />
  <KhoaHoc MaKhoaHoc="3" TenKhoaHoc="Ky Thuat May Tinh" />
</INFOR>

内容的提问来源于stack exchange,提问作者Duy Phạm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:43:24