我将此 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 类型的列上调用。
您需要先将其转换为
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);