Sql server 比较第二个SQL行向前的值与XML值?

Sql server 比较第二个SQL行向前的值与XML值?,sql-server,xml,Sql Server,Xml,我正在开发一个自动化程序,在这个程序中,我有一个XML请求体,它几乎没有值,我需要将这些值与SQL数据进行比较 我能够比较第一个SQL行和第一个XML节点,但不知道如何从第二行向上比较 下面给出了详细的示例代码 XML格式的请求正文示例: <Students> <Student id="101" course="Computer" Year="2016"/> <Student id="102" course="Electrical" Year="20

我正在开发一个自动化程序,在这个程序中,我有一个XML请求体,它几乎没有值,我需要将这些值与SQL数据进行比较

我能够比较第一个SQL行和第一个XML节点,但不知道如何从第二行向上比较

下面给出了详细的示例代码

XML格式的请求正文示例:

<Students>
    <Student id="101" course="Computer" Year="2016"/>
    <Student id="102" course="Electrical" Year="2017"/>
    <Student id="103" course="Mechanical" Year="2019"/>
</Students>

从SQL返回的示例数据:

id    course       Year   
==========================
101    Computer       2016
102    Electronics    2017
103    Mechanical     2019


<teststep id="Verify_Student" action ="validate"  description="Validate Student DB" argsvalue="XML_TagValue" >
    <validation id="ProductValidation"  comparisontype="contains">
      <operandexpected>
        <value id="Studentid" valuefrom="db" key="GetAllColumnValuesFromTable" column="id"/>
        <value id="StudentCourse" valuefrom="db" key="GetAllColumnValuesFromTable" column="course"/>
        <value id="Studentyear" valuefrom="db" key="GetAllColumnValuesFromTable" column="Year"/>
      </operandexpected>
      <operandactual>
        <value id="Studentid" valuefrom="previousstep" key="{0}" xpath="//Students/Student/id" attribute="id"/>
        <value id="StudentCourse" valuefrom="previousstep" key="{0}" xpath="//Students/Student/course" attribute="course"/>
        <value id="Studentyear" valuefrom="previousstep" key="{0}" xpath="//Students/Student/Year" attribute="Year"/>
      </operandactual>
    </validation>
  </teststep>
id课程年
==========================
101计算机2016
102电子2017
103机械2019

我希望它会比较XML值和SQL值,如果输出匹配,则会显示pass,如果一列不匹配,则会显示failed。

下面是比较DB表和XML请求的一种方法。也许不完全是你想要的,但它会给你一个领先的开始

SQL


请显示您尝试过的SQL(以及它是如何失败的),以及给定此示例数据,您希望得到的实际结果。如果我们不知道你到底做了什么以及你预期的结果是什么,那就很难提供帮助。
DECLARE @xml_request XML = N'<Students>
    <Student id="101" course="Computer" Year="2016"/>
    <Student id="102" course="Electrical" Year="2017"/>
    <Student id="103" course="Mechanical" Year="2019"/>
</Students>';

DECLARE @mockTbl TABLE (id INT PRIMARY KEY, course VARCHAR(30), [year] CHAR(4));
INSERT INTO @mockTbl (id, course, [year])
VALUES
(101, 'Computer', '2016')
, (102, 'Electronics', '2017')
, (103, 'Mechanical', '2019');

;WITH rs AS
(
    SELECT c.value('@id', 'INT') AS id
        , c.value('@course', 'VARCHAR(30)') AS course
        , c.value('@Year', 'CHAR(4)') AS [year]
    FROM @xml_request.nodes('/Students/Student') AS t(c)
)
(SELECT *, 'no match' AS result FROM rs
EXCEPT
SELECT *, 'no match' FROM @mockTbl)
UNION ALL
(SELECT *, 'match' FROM rs
INTERSECT
SELECT *, 'match' FROM @mockTbl);
+-----+------------+------+------------------+
| id  |   course   | year | result           |
+-----+------------+------+------------------+
| 102 | Electrical | 2017 | no match         |
| 101 | Computer   | 2016 | match            |
| 103 | Mechanical | 2019 | match            |
+-----+------------+------+------------------+