【问题标题】:Inserting column value, into XML column将列值插入 XML 列
【发布时间】:2017-01-23 11:44:35
【问题描述】:

我有一个名为 [catcot] 的表,它有一个“名称”列和一个“xml”列。

'name' 是一个 varchar,'xml' 是 XML 类型

目前“xml”列包含

<Cat>
  <Temp>.html</Temp>
</Cat>

我需要在“.html”之前的“名称”列中插入值

这可能吗?我尝试了一般更新,但它似乎不接受 XML 内容。

这是我尝试的更新:

UPDATE [db].[catcot]
SET xml = '<Cat><Temp>' + name + '.html</Temp></Cat>'
WHERE id = 24

导致

XML parsing: line 1, character 67, illegal name character

【问题讨论】:

  • 可以发布你的更新语句吗?
  • @Matt 问题的原因XML 解析:第 1 行,字符 67,非法名称字符很可能绑定到 name 中的非法字符。这就是为什么您不应该在字符串级别构建 XML。试想像Matt &amp; Friends 这样的名称或包含特殊/外来字符的名称。连接的字符串将类似于&lt;Cat&gt;&lt;Temp&gt;Matt &amp; Friends&lt;/Temp&gt;&lt;/Cat&gt;,这是不允许的...
  • @Matt - 你想追加 name 还是完全替换 &lt;Temp&gt; 节点值?

标签: sql sql-server xml insert sql-update


【解决方案1】:

尝试使用可更新的 CTE:

DECLARE @catcot TABLE(name VARCHAR(100),TheXml XML);
INSERT INTO @catcot VALUES
 ('test1','<Cat><Temp>.html</Temp></Cat>')
,('test2','<Cat><Temp>.html</Temp></Cat>');

WITH updateableCTE AS
(
    SELECT TheXml
          ,(SELECT name AS Temp FOR XML PATH('Cat')) AS NewXml
    FROM @catcot
)
UPDATE updateableCTE SET TheXml=NewXml;

SELECT * FROM @catcot;

重要!

您应该永远不要通过字符串连接创建 XML!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多