【问题标题】:Replace img src from a Html column in Sql Sqrver从 Sql Server 中的 Html 列替换 img src
【发布时间】:2015-11-18 11:06:40
【问题描述】:

有没有办法从 Sql Sqrver 中的 Html 列替换 img src?例如,SELECT TOP 1 html FROM TableName 导致

<p><img id="img" title="imgtitle" src="/source1.jpg" width="225" height="300" /> text</p>

我需要通过将 /source1.jpg 替换为 /source2.jpg 来更新它

source1 可以是任何动态字符串(即首先我需要使用查询在 html 列中找到它)。

<p><img id="img" title="imgtitle" src="/source2.jpg" width="225" height="300" /> text</p>

我心中有一件事是使用正则表达式,但我不知道如何在 SQL Server 中使用正则表达式以及如何使用它来更新它。

有人知道怎么做吗?

【问题讨论】:

    标签: html sql-server regex replace


    【解决方案1】:

    您可以使用以下查询来实现您的目标:

    DECLARE @SRC VARCHAR(MAX) = '<P><IMG ID="IMG" TITLE="IMGTITLE" SRC="/SOURCE1.JPG" WIDTH="225" HEIGHT="300" /> TEXT</P>';
    
    DECLARE @SUB VARCHAR(MAX) = RIGHT(@SRC, (LEN(@SRC)-PATINDEX ( '%SRC="%' , @SRC )-5));
    
    DECLARE @LEN INT = CHARINDEX ( '"' , @SUB );
    
    SELECT REPLACE(@SRC,SUBSTRING(@SRC,(PATINDEX ( '%SRC="%' , @SRC )+5),@LEN),'/NEWVALUE.JPG');
    

    【讨论】:

    • 完美。它既简单又干净。谢谢。
    【解决方案2】:

    您可以使用 xml 功能:

    DECLARE @t TABLE (RecordXML XML);
    Declare @xml XML
    SET @xml = '<p>
      <img id="img" title="imgtitle" src="/source1.jpg" width="225" height="300" />
      text
      </p>'
    INSERT @t VALUES (@xml);
    
    DECLARE @value nvarchar(50)  = '/source2.jpg'
    DECLARE @oldvalue nvarchar(50) = '/source1.jpg'
    
    UPDATE
      @t
    SET
       RecordXML.modify('replace value of 
       (/p/img/@src[.=sql:variable("@oldvalue")])[1] with sql:variable("@value")')
    WHERE
      RecordXML.exist('/p/img[@src=sql:variable("@oldvalue")]') = 1;
    
    
    SELECT * FROM @t;
    

    我认为这比使用 REPLACE 功能更准确

    编辑:

    试试这个查询,它将使用两列(旧值和新值)更改值,或者给我一个数据样本:)

    DECLARE @t TABLE (RecordXML XML, oldvalue nvarchar(100), value nvarchar(100));
    DECLARE @xml1 XML = '<p><img id="img" title="imgtitle" src="/source1.jpg" width="225" height="300" />text</p>';
    DECLARE @xml2 XML = '<p><img id="img" title="imgtitle" src="/source5.jpg" width="225" height="300" />text</p>';
    
    
    INSERT @t VALUES (@xml1, '/source1.jpg', '/source2.jpg');
    INSERT @t VALUES (@xml2, '/source5.jpg', '/sourceabc.jpg');
    
    UPDATE
      @t
    SET
       RecordXML.modify('replace value of
       (/p/img/@src[.=sql:column("oldvalue")])[1] with sql:column("value")')
    WHERE
      RecordXML.exist('/p/img[@src=sql:column("oldvalue")]') = 1;
    
    
    SELECT RecordXML FROM @t;
    

    编辑: 或者如果您不知道旧值,您可以更改更新查询:

    UPDATE
      @t
    SET
       RecordXML.modify('replace value of
       (/p/img/@src)[1] with sql:column("value")');
    

    【讨论】:

    • 我不能在@value@oldvalue 中给出静态值,因为这可能是我需要在列中找到的任何值。
    • 我觉得新的查询更好,你试过了吗? @NitinKatiyar
    【解决方案3】:

    你可以在 sql server 中使用替换功能:

    declare @valFrom  nvarchar
    declare @valTo  nvarchar
    
    set @valFrom = '/source1.jpg'
    set @valTo = '/source2.jpg'
    
    update TableName
      set html = replace(html, @valFrom, @valTo)
    

    将@valFrom 和@valTo 设置为您喜欢的任何值。可能值得将它们设置为:

    set @valFrom = 'src="/source1.jpg"'
    set @valTo = 'src="/source2.jpg"'
    

    这将确保您实际上只是在更改 src。

    如果你的字段类型是 xml,你可能需要做一些转换:

    declare @valFrom  varchar(max)
    declare @valTo  varchar(max)
    
    set @valFrom = '/source1.jpg'
    set @valTo = '/source2.jpg'
    
    update TableName
      set html = replace(cast(html as varchar(max)), @valFrom, @valTo)
    

    【讨论】:

    • 我不能只使用replace,因为我需要更新 100 行,我需要在替换之前先找到 src 值。
    • @NitinKatiyar 没问题,我误解了你所说的动态的意思。你是说“source2.jpg”可以是任何东西。此方法不起作用,但我确信可以修改其他答案以满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2016-03-09
    • 2017-01-10
    • 1970-01-01
    • 2014-05-07
    • 2016-06-03
    相关资源
    最近更新 更多