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
相关产品推荐
相关产品推荐

