我有一张包含一个 XML 数据类型列的表。 XML格式如下
表:根表
+----+------------------------------------------------------+
|Id | Data |
+----+------------------------------------------------------+
|1 | <Root><Id>1</Id><SubRoot>Production</SubRoot></Root> |
+----+------------------------------------------------------+
|2 | <Root><Id>1</Id><SubRoot>Test</SubRoot></Root> |
+----+------------------------------------------------------+
我需要更新 XML,如下所示,
+----+------------------------------------------------------+
|Id | Data |
+----+------------------------------------------------------+
|1 | <Root><Id>1</Id><SubRoot>production</SubRoot></Root> |
+----+------------------------------------------------------+
|2 | <Root><Id>1</Id><SubRoot>test</SubRoot></Root> |
+----+------------------------------------------------------+
这里我需要将 SubRoot 的值全部更新为小写。 请帮助我了解如何在 SQL Server 中使用 T-SQL 更新此内容。
这有点难看,但它可以完成工作。
UPDATE RootTable
SET data = CAST(REPLACE(CAST(data AS varchar(max)), CAST(data.query('/Root/SubRoot') AS varchar(max)), '<SubRoot>' + lower(data.value('(/Root/SubRoot)[1]', 'varchar(max)')) + '</SubRoot>') as xml);
REPLACE
不会对 xml 类型进行操作,所以我们必须进行转换。
对于第二个参数,我采用整个 SubRoot 节点,以防这些值在另一个节点中重复,而您不希望它们为小写。如果您知道情况并非如此,那么您可以在第二个参数中仅采用
data.value
(因为它在第三个参数中使用)并从第三个参数中删除周围的节点值。
有一个
xml.modify
函数,但这需要一个字符串文字才能工作,而且我不知道如何使要修改的值依赖于它自己!
希望其他人可以提供更简洁的解决方案。