未存储为 XML 时以表格格式返回 XML 数据

问题描述 投票:0回答:1

我将此 XML 数据存储在 SQL 表的 varchar(8000) 列中,不幸的是不是作为 XML 列。

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfRate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Rate>
        <SituationID>1</SituationID>
        <SituationDescription>S</SituationDescription>
        <PaymentFortnight>8.40</PaymentFortnight>
        <PaymentRentLessThan>4.00</PaymentRentLessThan>
        <PaymentRentMoreThan>5.20</PaymentRentMoreThan>
    </Rate>
    <Rate>
        <SituationID>2</SituationID>
        <SituationDescription>M</SituationDescription>
        <PaymentFortnight>9.40</PaymentFortnight>
        <PaymentRentLessThan>5.00</PaymentRentLessThan>
        <PaymentRentMoreThan>6.20</PaymentRentMoreThan>
    </Rate>
</ArrayOfRate>

尽管它是一个 varchar 列,有没有办法可以将数据转换为表格格式?有很多,但我只展示了 2 个作为示例。

比如以下:

情况ID 情况描述 两周付款 付款租金低于 付款租金超过
1 S 8.40 4.00 5.20
2 M 9.40 5.00 6.20

我仅以其中一列作为开始尝试了以下操作:

select
    a.b.value('Rate[1]/SituationID[1]','varchar(10)') as [ID]
FROM TableName.Rate.nodes('ArrayOfRate') a(b)

但出现以下错误:

消息 107,第 15 级,状态 1,第 40 行 列前缀“TableName”与查询中使用的表名称或别名不匹配。

消息 9506,第 16 层,状态 1,第 37 行 XMLDT 方法“节点”只能在 xml 类型的列上调用。

sql sql-server xml t-sql sql-server-2017
1个回答
0
投票

您需要先将其转换为

xml
,然后才能在其上使用 XML 函数。

但是因为它使用 UTF-16 编码前导码,所以您需要先将其转换为

nvarchar
。这反过来意味着它至少应该保留为
nvarchar
,并且最好将其存储为
xml

SELECT
  SituationID = x1.Rate.value('(SituationID/text())[1]', 'int')
FROM Tablename tn
CROSS APPLY (
    SELECT CAST(CAST(tn.Rate AS nvarchar(max)) AS xml) AS xmlCol
) v
CROSS APPLY v.xmlCol.nodes('ArrayOfRate/Rate') x1(Rate);

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.