Sql server 比较第二个SQL行向前的值与XML值?
我正在开发一个自动化程序,在这个程序中,我有一个XML请求体,它几乎没有值,我需要将这些值与SQL数据进行比较 我能够比较第一个SQL行和第一个XML节点,但不知道如何从第二行向上比较 下面给出了详细的示例代码 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
<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 |
+-----+------------+------+------------------+