如何使用 SQL Server 2016 删除 XML 子节点
How to delete a XML child node using SQL Server 2016
我有以下 Xml 摘自较大文件的示例片段:
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
我正在尝试使用 SQL 删除 <ProductTypeId>
节点,这样上面的内容将如下所示:
<EntityAttributeValue>
<Value />
<Attribute>
<Id>13</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
</EntityAttributeValue>
我已使用以下内容 SQL 查询 XML 并分离出上面的片段(第一个)
select t.c.query('.') as Attributes
from @XMLData.nodes('/Item/ContentAttributeValues/EntityAttributeValue') t(c)
where t.c.value('(Attribute/Id)[1]','INT') = 0
我试过了
SET @XMLData.modify('delete (/Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId)')
删除所有产品id,但无济于事,将不胜感激。
干杯
在您提供的 XML 片段中,您有一个不同的根。因此,为了使您的 delete
正常工作,您只需调整路径:
SET @XMLData.modify('delete /EntityAttributeValue/ProductTypeId');
这是一个完整的例子。我必须向根添加一个命名空间以容纳 xsi:nil="true"
属性。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML NOT NULL);
INSERT INTO @tbl (xmldata) VALUES
(N'<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentAttributeValues>
<EntityAttributeValue>
<Value/>
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true"/>
</EntityAttributeValue>
<EntityAttributeValue>
<Value/>
<Attribute>
<Id>10</Id>
<Name>Use 7</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999770</AttributeValueId>
<ProductTypeId xsi:nil="true"/>
</EntityAttributeValue>
</ContentAttributeValues>
</Item>');
-- DDL and sample data population, end
UPDATE @tbl
SET xmldata.modify('delete /Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId');
SELECT * FROM @tbl;
Output XML
<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentAttributeValues>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
</EntityAttributeValue>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>10</Id>
<Name>Use 7</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999770</AttributeValueId>
</EntityAttributeValue>
</ContentAttributeValues>
</Item>
根据我获取的代码,您正在搜索 EAV 元素的 <ProductTypeId>
,其中 <Attribute><Id>
的值为 0
。
你的问题不是很清楚,但我想你可能正在寻找这个:
declare @tbl TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @tbl VALUES
(N'<Item xmlns:xsi="blahblah">
<ContentAttributeValues>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id> <!-- Id value = 0 -->
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>1</Id> <!-- Other Id value!!! -->
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
</ContentAttributeValues>
</Item>');
UPDATE @tbl SET YourXml.modify(N'delete /Item
/ContentAttributeValues
/EntityAttributeValue[Attribute/Id = 0]
/ProductTypeId');
SELECT * FROM @tbl;
XPath 代表:深入 EAV 元素并筛选回答谓词的元素。在这个 EAV 元素下方找到 <ProductTypeID>
并将其删除。
在结果中您会发现,仅删除了具有 Id=0
的第一个 EAV 元素的节点。
大家好,感谢您的评论。
抱歉没有让我的代码清晰,我以为它在我的脑海里,而且已经很晚了!哈哈
SET @XMLData.modify('delete(/Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId)')
工作了一个享受..我之前尝试过但是我遇到了错误,我知道删除后的括号是它工作的关键哈!
再次感谢大家!!
我有以下 Xml 摘自较大文件的示例片段:
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
我正在尝试使用 SQL 删除 <ProductTypeId>
节点,这样上面的内容将如下所示:
<EntityAttributeValue>
<Value />
<Attribute>
<Id>13</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
</EntityAttributeValue>
我已使用以下内容 SQL 查询 XML 并分离出上面的片段(第一个)
select t.c.query('.') as Attributes
from @XMLData.nodes('/Item/ContentAttributeValues/EntityAttributeValue') t(c)
where t.c.value('(Attribute/Id)[1]','INT') = 0
我试过了
SET @XMLData.modify('delete (/Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId)')
删除所有产品id,但无济于事,将不胜感激。
干杯
在您提供的 XML 片段中,您有一个不同的根。因此,为了使您的 delete
正常工作,您只需调整路径:
SET @XMLData.modify('delete /EntityAttributeValue/ProductTypeId');
这是一个完整的例子。我必须向根添加一个命名空间以容纳 xsi:nil="true"
属性。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML NOT NULL);
INSERT INTO @tbl (xmldata) VALUES
(N'<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentAttributeValues>
<EntityAttributeValue>
<Value/>
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true"/>
</EntityAttributeValue>
<EntityAttributeValue>
<Value/>
<Attribute>
<Id>10</Id>
<Name>Use 7</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999770</AttributeValueId>
<ProductTypeId xsi:nil="true"/>
</EntityAttributeValue>
</ContentAttributeValues>
</Item>');
-- DDL and sample data population, end
UPDATE @tbl
SET xmldata.modify('delete /Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId');
SELECT * FROM @tbl;
Output XML
<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentAttributeValues>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id>
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
</EntityAttributeValue>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>10</Id>
<Name>Use 7</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999770</AttributeValueId>
</EntityAttributeValue>
</ContentAttributeValues>
</Item>
根据我获取的代码,您正在搜索 EAV 元素的 <ProductTypeId>
,其中 <Attribute><Id>
的值为 0
。
你的问题不是很清楚,但我想你可能正在寻找这个:
declare @tbl TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @tbl VALUES
(N'<Item xmlns:xsi="blahblah">
<ContentAttributeValues>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>0</Id> <!-- Id value = 0 -->
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
<EntityAttributeValue>
<Value />
<Attribute>
<Id>1</Id> <!-- Other Id value!!! -->
<Name>Use 3</Name>
<AttributeType>other</AttributeType>
</Attribute>
<AttributeValueId>999998</AttributeValueId>
<ProductTypeId xsi:nil="true" />
</EntityAttributeValue>
</ContentAttributeValues>
</Item>');
UPDATE @tbl SET YourXml.modify(N'delete /Item
/ContentAttributeValues
/EntityAttributeValue[Attribute/Id = 0]
/ProductTypeId');
SELECT * FROM @tbl;
XPath 代表:深入 EAV 元素并筛选回答谓词的元素。在这个 EAV 元素下方找到 <ProductTypeID>
并将其删除。
在结果中您会发现,仅删除了具有 Id=0
的第一个 EAV 元素的节点。
大家好,感谢您的评论。
抱歉没有让我的代码清晰,我以为它在我的脑海里,而且已经很晚了!哈哈
SET @XMLData.modify('delete(/Item/ContentAttributeValues/EntityAttributeValue/ProductTypeId)')
工作了一个享受..我之前尝试过但是我遇到了错误,我知道删除后的括号是它工作的关键哈!
再次感谢大家!!