gpt4 book ai didi

sql - 在类型化的 xml 列上选择节点的原子值

转载 作者:行者123 更新时间:2023-12-03 15:51:59 25 4
gpt4 key购买 nike

如果不能在类型化的 xml 列中使用 text(),如何获取元素的原子值?

这个查询;

-- Add schema
CREATE XML SCHEMA COLLECTION MySchema AS N'<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns="http://mynamespace"
targetNamespace="http://mynamespace">

<xs:element name="element1" type="element1Type">
</xs:element>

<xs:complexType name="element1Type">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="element2" type="element2Type" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="element2Type">
<xs:sequence>
<xs:element name="element3" type="element3Type" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="element3Type">
<xs:sequence minOccurs="0">
<xs:element minOccurs="0" name="element4" />
</xs:sequence>
</xs:complexType>

</xs:schema>'
GO

-- Create table
CREATE TABLE [dbo].[MyTable](
[XmlColumn] [xml](CONTENT [dbo].[MySchema]) NOT NULL
)
GO

-- Add test data
INSERT INTO MyTable SELECT N'<element1 xmlns="http://mynamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<element2>
<element3>
<element4>my text here</element4>
</element3>
</element2>
</element1>'
GO

-- run query
WITH XMLNAMESPACES(
'http://mynamespace' as s,
DEFAULT 'http://mynamespace'
)
SELECT
T.rows.value('(element3/element4)[1]/text()', 'varchar(100)') as [AtomicValue]
FROM
MyTable
CROSS APPLY
XmlColumn.nodes('/element1/element2') T(rows)

结果;

XQuery [MyTable.XmlColumn.value()]: 'text()' is not supported on simple typed or'http://www.w3.org/2001/XMLSchema#anyType' elements, found'element({http://mynamespace}:element4,xs:anyType) ?'.

我读过 this ,但是对我希望能够读取的每个原子值的模式进行大规模编辑感觉就像杀伤力...

最佳答案

您可以使用查询,然后使用

WITH XMLNAMESPACES(
'http://mynamespace' as s,
DEFAULT 'http://mynamespace'
)
SELECT
T.rows.query('element3/element4').value('.', 'varchar(100)')
FROM
MyTable
CROSS APPLY
XmlColumn.nodes('/element1/element2') T(rows)

或者您可以在模式中指定 element4 的类型。

<xs:element minOccurs="0" name="element4" type="xs:string"/>

并使用这个查询

WITH XMLNAMESPACES(
'http://mynamespace' as s,
DEFAULT 'http://mynamespace'
)
SELECT
T.rows.value('(element3/element4)[1]', 'varchar(100)') as [AtomicValue]
FROM
MyTable
CROSS APPLY
XmlColumn.nodes('/element1/element2') T(rows)

关于sql - 在类型化的 xml 列上选择节点的原子值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com