SQL 服务器插入 XML 节点正在添加命名空间
SQL Server insert XML node is adding namespace
我有一个现有的 XML 列,我想向其追加一个节点,但添加的节点带有不需要的命名空间。
DECLARE @x XML =
'<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="abc">
<Setting key="display" display="ABC" group="service" enabled="true">
<Value xsi:type="xsd:string">ABC</Value>
</Setting>
</Test>'
CREATE TABLE #C ( x XML )
INSERT INTO #C
SELECT @X
declare @name varchar(50) = 'ABC'
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting> as last into (/Test[1])')
select * from #C
导致新设置被添加为...
<Setting key="about" display="About" group="service" enabled="true">
<Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">string of text about ABC here.</Value>
</Setting>
但我真正想要的是
<Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about ABC here.</Value>
</Setting>
服务器 SQL-Server 的 XML 引擎处理命名空间的方式 - 在某些情况下 - 非常烦人......重要的是要说,以上内容并没有错......重复命名空间声明完全没问题,但它会使结果膨胀,使人们难以阅读和理解 XML 并且它可能会在(到)严格验证器中失败。
原因是,这样的XML总是完整的。您可以将它放在 XML.
中的任何位置
在您的情况下,您可以通过提前告知引擎有关命名空间的方式获得所需的结果:
隐式声明
UPDATE #C
SET X.modify('declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";
insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting>
as last into (/Test[1])');
或WITH XMLNAMESPACES()
:
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting>
as last into (/Test[1])');
我有一个现有的 XML 列,我想向其追加一个节点,但添加的节点带有不需要的命名空间。
DECLARE @x XML =
'<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="abc">
<Setting key="display" display="ABC" group="service" enabled="true">
<Value xsi:type="xsd:string">ABC</Value>
</Setting>
</Test>'
CREATE TABLE #C ( x XML )
INSERT INTO #C
SELECT @X
declare @name varchar(50) = 'ABC'
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting> as last into (/Test[1])')
select * from #C
导致新设置被添加为...
<Setting key="about" display="About" group="service" enabled="true">
<Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">string of text about ABC here.</Value>
</Setting>
但我真正想要的是
<Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about ABC here.</Value>
</Setting>
服务器 SQL-Server 的 XML 引擎处理命名空间的方式 - 在某些情况下 - 非常烦人......重要的是要说,以上内容并没有错......重复命名空间声明完全没问题,但它会使结果膨胀,使人们难以阅读和理解 XML 并且它可能会在(到)严格验证器中失败。
原因是,这样的XML总是完整的。您可以将它放在 XML.
中的任何位置在您的情况下,您可以通过提前告知引擎有关命名空间的方式获得所需的结果:
隐式声明
UPDATE #C
SET X.modify('declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";
insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting>
as last into (/Test[1])');
或WITH XMLNAMESPACES()
:
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
<Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
</Setting>
as last into (/Test[1])');