微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新一个字符串中的多个子字符串

如何解决更新一个字符串中的多个子字符串

我在一个 sql 表中存储了一个文本字符串,其中包含以下所有文本。格式为 XML,但字段定义为 varchar。

我正在使用 sql Server 2012 查询此数据:

<?xml version="1.0" encoding="utf-16"?>  
    <SaveFileContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">    
            <Mappings>  
                  <SaveFileModel Header="Model1" FullPath="Model1" ViewType="ModelView" /> 
   
                  <SaveFileModel Header="xyz" FullPath="\\server\directory\" ViewType="TradeView" />      

                  <SaveFileModel Header="Model2" FullPath="Model2" ViewType="ModelView" />

                  <SaveFileModel Header="Model3" FullPath="Model3" ViewType="ModelView" /> 

                  <SaveFileModel Header="abc" FullPath="\\server\directory\" ViewType="TradeView" />    

                  <SaveFileModel Header="def" FullPath="\\server\directory\" ViewType="TradeView" />

                  <SaveFileModel Header="ghi" FullPath="\\server\directory\" ViewType="TradeView"/>
            </Mappings>  
    </SaveFileContext>

如何更新或删除 viewtype="ModelView" 处的整行文本?

我想删除此单个字符串中 viewtype="ModelView" 的所有行,并将其替换为空格。在上面的示例中,我想总共删除 3 行并保留其余行。

最后,我希望字符串如下所示(请记住,所有行都包含在 1 个单独的字符串中。我只是将它们分开以方便查看。

<?xml version="1.0" encoding="utf-16"?>  
    <SaveFileContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">    
            <Mappings>  
                  <SaveFileModel Header="xyz" FullPath="\\server\directory\" ViewType="TradeView" />      

                  <SaveFileModel Header="abc" FullPath="\\server\directory\" ViewType="TradeView" />    

                  <SaveFileModel Header="def" FullPath="\\server\directory\" ViewType="TradeView" />

                  <SaveFileModel Header="ghi" FullPath="\\server\directory\" ViewType="TradeView"/>
            </Mappings>  
    </SaveFileContext>

这是我当前用来替换行的查询,但要替换的值非常具体。我基本上是输入要查找的字符串来替换。

IF OBJECT_ID('tempdb..#replacement') IS NOT NULL
   DROP TABLE #replacement

CREATE TABLE #replacement (
   string_pattern VARCHAR(100),string_replacement VARCHAR(5)
);

INSERT INTO #replacement (
   string_pattern,string_replacement
)
VALUES
   ('<SaveFileModel Header="Model1" FullPath="Model1" ViewType="ModelView" />',''),('<SaveFileModel Header="Model2" FullPath="Model2" ViewType="ModelView" />',('<SaveFileModel Header="Model3" FullPath="Model3" ViewType="ModelView" />',('<SaveFileModel Header="Model4" FullPath="Model4" ViewType="ModelView" />',('<SaveFileModel Header="Model5" FullPath="Model5" ViewType="ModelView" />',('<SaveFileModel Header="Model6" FullPath="Model6" ViewType="ModelView" />',('<SaveFileModel Header="Model7" FullPath="Model7" ViewType="ModelView" />',('<SaveFileModel Header="Model8" FullPath="Model8" ViewType="ModelView" />',('<SaveFileModel Header="Model9" FullPath="Model9" ViewType="ModelView" />',('<SaveFileModel Header="Model10" FullPath="Model10" ViewType="ModelView" />',('<SaveFileModel Header="Model11" FullPath="Model11" ViewType="ModelView" />',('<SaveFileModel Header="Model12" FullPath="Model12" ViewType="ModelView" />',('<SaveFileModel Header="Model13" FullPath="Model13" ViewType="ModelView" />',('<SaveFileModel Header="Model14" FullPath="Model14" ViewType="ModelView" />',('<SaveFileModel Header="Model15" FullPath="Model15" ViewType="ModelView" />',('<SaveFileModel Header="Model16" FullPath="Model16" ViewType="ModelView" />',('<SaveFileModel Header="Model17" FullPath="Model17" ViewType="ModelView" />',('<SaveFileModel Header="Model18" FullPath="Model18" ViewType="ModelView" />',('<SaveFileModel Header="Model19" FullPath="Model19" ViewType="ModelView" />',('<SaveFileModel Header="Model20" FullPath="Model20" ViewType="ModelView" />','');

DECLARE @string AS VARCHAR(MAX),@userident varchar(20);

DECLARE userviewdef CURSOR FOR
SELECT
        UserID
    FROM
        TableSettings where section = 'user view session'

OPEN userviewdef;

FETCH NEXT FROM userviewdef INTO
    @userident;

WHILE @@FETCH_STATUS = 0
    BEGIN
        select @string = varcharvalue from tablesettings where section = 'user view session' and userid = @userident

        -- Perform all replacements
        SELECT @string = REPLACE(@string,string_pattern,string_replacement) FROM #replacement;

        -- Return new string
        --PRINT @string;
        
        update tablesettings
        set varcharvalue = @string
        where section = 'user view session' and userid = @userident
        

        FETCH NEXT FROM userviewdef INTO
        @userident;

    END;

CLOSE userviewdef;

DEALLOCATE userviewdef;

在某些情况下,字符串可能是下面看到的内容,并且不会被删除,因为它不适合我编码要删除的任何字符串。我想找到一种简单的方法删除 ViewType="ModelView" 中的任何行,因为这是我的标准。

<SaveFileModel Header="ThisIsSomethingElse" FullPath="Model1" ViewType="ModelView" /> 

4/21/21: 在遵循@FrankPl 的建议使用 XML 之后,我想到了这里。结果返回一个空格。我可能对 XML 查询部分的编码有误,需要一些帮助:

DECLARE @stringXML XML,@finalString varchar(max),@userident varchar(20);

        

DECLARE userviewdef CURSOR FOR

SELECT
        UserID
    FROM
        TableSettings where section = 'user view session';

OPEN userviewdef;

FETCH NEXT FROM userviewdef INTO
    @userident;

WHILE @@FETCH_STATUS = 0
    BEGIN

        select @stringXML = varcharvalue from tablesettings where section = 'user view session' and userid = @userident

        
        select @stringXML.query('
            for $item in (/SaveFileContext/Mappings/SaveFileModel)
            return if ($item[@ViewType = "ModelView"]) then string($item) else ""
            ')

        select @finalString = convert(varchar(max),@stringXML)

        -- Return new string
        PRINT @finalstring;
        

        FETCH NEXT FROM userviewdef INTO
        @userident;

    END;

CLOSE userviewdef;

DEALLOCATE userviewdef;

解决方法

如果您将 @step 变量声明为数据类型 XML 而不是 varchar,您可以使用 XQuery 来处理数据,在这种情况下 a FLOWR expression文字 XML 元素,大括号从文字模式切换到 XPath 模式:

SELECT @string.query('
    <SaveFileContext>    
        <Mappings> {
   for $item in (/SaveFileContext/Mappings/SaveFileModel)  
   return if ($item[@ViewType = "ModelView"]) then $item else ()
      } </Mappings>  
   </SaveFileContext>
'

XML 声明和命名空间被 SQLServer XML 处理器吞下。

此解决方案假定数据是有效的 XML 片段。

请注意 - 因为整个查询需要是一个 SQL 字符串(即单引号),并且 XQuery 接受双引号和单引号中的字符串,为简单起见,我在这里使用了双引号。或者,我可以使用双引号在 SQL 字符串中对它们进行转义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。