【问题标题】:Compare 2nd SQL rows onward values with XML values?将第二个 SQL 行向前的值与 XML 值进行比较?
【发布时间】:2019-09-27 20:29:51
【问题描述】:

我正在开发一个自动化程序,其中我有一个 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>

我希望它会比较 XML 值和 SQL 值,如果输出匹配,那么它将显示通过,或者如果一列不匹配则失败。

【问题讨论】:

  • 请显示您尝试过的 SQL(以及它是如何失败的),以及在给定此示例数据的情况下您想要的实际结果。如果我们不确切知道您尝试了什么以及您的预期结果是什么,我们将很难提供帮助。

标签: sql-server xml


【解决方案1】:

这是比较 DB 表和 XML 请求的一种方法。也许不完全是您正在寻找的东西,但它会给您一个良好的开端。

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            |
+-----+------------+------+------------------+

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 1970-01-01
    • 2021-08-24
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多