从存储 XML 且数据类型为 CLOB 的字段中检索数据

Retrieve data from field which stores XML and datatype is CLOB

我想检索存储在名称为 inpatienttype 的 PKDATA 数据字段中的 XML 值 returns value 262784091 as inpatienttype

输出

一个 B 住院类型
11,212 2587165 262784091

数据集 Image

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:DataSet xmlns:ns2="http://www.test.com/t/cn/el">
    <EnumObject>
        <name>InpatientType</name>
        <prompt>InpatientType</prompt>
        <value>262784091</value>
        <radiobutton>false</radiobutton>
    </EnumObject>
    <StringObject>
        <name>xxx</name>
        <prompt></prompt>
        <value>/widget.jsp</value>
        <width>99</width>
    </StringObject>
</ns2:DataSet>

我使用了以下查询但没有用

SELECT XMLQUERY(
  '/EnumObject/name'
  PASSING XMLTYPE(e.pkdata)
  RETURNING CONTENT
  ) AS name
FROM EXTDATA as e

select x.*
from [dbo].[EXTRADATA] rt
cross join xmltable(
  '/EnumObject/name'
  passing xmltype(rt.packeddata)
  columns name number path 'name/@value'
) x

收到此错误

Parse error at line: 3, column: 3: Incorrect syntax near 'PASSING'.

有人可以帮我吗

在 Microsoft SQL 服务器中,您可以通过 nodes(), query() and value() 函数使用 XQuery。

如果源数据涉及自定义 XML 命名空间,您还可以使用 with xmlnamespaces 命名空间限定 XQuery 的节点,例如:

with xmlnamespaces (
  'http://www.test.com/t/cn/el' as cnel
)
select
  EnumObject.value('(./name/text())[1]', 'varchar(50)') as name,
  EnumObject.value('(./prompt/text())[1]', 'varchar(50)') as prompt,
  EnumObject.value('(./value/text())[1]', 'varchar(50)') as value
from dbo.TOCEXTRADATA
cross apply packeddata.nodes('/cnel:DataSet/EnumObject') p(EnumObject);
name prompt value
InpatientType InpatientType 262784091

以下查询避免了根节点上的自定义命名空间和 returns 等效结果:

select
  EnumObject.value('(./name/text())[1]', 'varchar(50)') as name,
  EnumObject.value('(./prompt/text())[1]', 'varchar(50)') as prompt,
  EnumObject.value('(./value/text())[1]', 'varchar(50)') as value
from dbo.TOCEXTRADATA
cross apply packeddata.nodes('//EnumObject') p(EnumObject);
name prompt value
InpatientType InpatientType 262784091

编辑:packeddata 列的数据类型不是 xml 时,您需要将其转换为正确的类型。以上两个示例查询需要修改如下:

with xmlnamespaces (
  'http://www.test.com/t/cn/el' as cnel
)
select
  EnumObject.value('(./name/text())[1]', 'varchar(50)') as name,
  EnumObject.value('(./prompt/text())[1]', 'varchar(50)') as prompt,
  EnumObject.value('(./value/text())[1]', 'varchar(50)') as value
from dbo.TOCEXTRADATA
outer apply ( select cast(packeddata as xml) as xmlData ) oa
cross apply xmlData.nodes('/cnel:DataSet/EnumObject') p(EnumObject);
select
  EnumObject.value('(./name/text())[1]', 'varchar(50)') as name,
  EnumObject.value('(./prompt/text())[1]', 'varchar(50)') as prompt,
  EnumObject.value('(./value/text())[1]', 'varchar(50)') as value
from dbo.TOCEXTRADATA
outer apply ( select cast(packeddata as xml) as xmlData ) oa
cross apply xmlData.nodes('//EnumObject') p(EnumObject);