从存储 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);
我想检索存储在名称为 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);