【问题标题】:Edit XML saved as string in table column using SQL使用 SQL 在表列中编辑保存为字符串的 XML
【发布时间】:2019-09-02 16:51:13
【问题描述】:

名为 xmlString 的列包含存储为字符串的 XML。我需要检查,对于该列的每个值,它是否包含包裹在一堆 周围的 tag1 的某个值标签2-s。 tag2-s 由键值对组成(基本上每个都保存一个字典项)。我需要在具有特定值的 tag1 中添加一个新的 tag2 包含一个新的键值对。

例如,我有这个:

<tag1 name=\"test_name\">
    <tag2 key=\"test_key\" value=\"test_value\" />
</tag1>

作为我 XML 的一部分,我想在 tag1 中添加一个新的 tag2包含 name=\"test_name\",如果可能的话,甚至只包含 "test_name\"

期望的结果如下所示:

<tag1 name=\"test_name\">
    <tag2 key=\"test_key\" value=\"test_value\" />
    <tag2 key=\"new_key\" value=\"new_value\" />
</tag1>

我需要使用 SQL 执行此操作,并且基本上使用新的 tag2 更新每一行(如果它包含)

<tag1 name =\"test_name\">

【问题讨论】:

  • 您需要指定您的数据库是什么。每个数据库供应商支持的 SQL 变体略有不同。
  • 它是 Microsoft SQL Server 17。

标签: sql xml


【解决方案1】:

迟来的答案,我想我会发布我所做的,以便对其他人有所帮助。我最终只使用了 XQuery。在检查具有“test_name”属性的元素是否存在后,我使用条件插入语句构造了一个查询,以检查 xml 是否包含类似元素(带有键“test_key”的 tag2)的某个值(真/假),设置我的基于该值的新元素 ("tag2[@key="new_key") 值并将其插入到适当的位置。新的 xml 被转换为字符串,然后我用新值更新了每一列。

DECLARE @id int
DECLARE @max_id int
DECLARE @xml_form xml
DECLARE @string_form nvarchar(max)

SET @id = (SELECT MIN(Id) FROM FormsTable)
SET @max_id = (SELECT MAX(Id) FROM FormsTable)

WHILE(@id is not NULL and @id <= @max_id)
BEGIN
    SET @xml_form = (SELECT xmlColumn FROM FormsTable WHERE id = @id)
        IF @xml_form.exist('(//tag1[@name="test_name"])') = 1
        BEGIN
            IF  @xml_form.exist('(//tag1[@name="test_name"]/tag2[@key="new_key"])') = 0
            BEGIN
                SET @xml_form.modify('
                   insert   
                   if(//tag1[@name="test_name"]/tag2[@key="test_key" and @value="true"])
                      then
                         <tag2 key ="new_key" value="true"/>                        
                      else
                         <tag2 key ="new_key" value="false"/>
                      after
                         (//tag1[@name="test_name"]/tag2[@key="test_key"])[1]
                   ')   

                SET @string_form = CONVERT(nvarchar(max), @xml_form);

                UPDATE FormsTable
                SET xmlColumn = @string_form
                WHERE Id = @id  

            END
        END
    SET @id  = (SELECT MIN(Id) FROM FormsTable  WHERE Id > @id)
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2011-09-29
    • 2023-04-10
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多