代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

SQL Server:字符串操作,取消激活

  •  1
  • OMG Ponies  · 技术社区  · 15 年前

    我有一个专栏叫 body ,其中包含我们的CMS的正文内容。数据如下所示:

    …{斗篷:id=1.1.1}…{斗篷}…{斗篷:id=1.1.2}…{斗篷}…{斗篷:id=1.1.3}…{斗篷}。。。

    一个适度调整的可读性示例:

    ## h5. A formal process for approving and testing all external network connections and changes to the firewall and router configurations? 
    {toggle-cloak:id=1.1.1}{tree-plus-icon} *Compliance:* {color:red}{*}Partial{*}{color} (?) 
    {cloak:id=1.1.1} || Date: | 2010-03-15 || || Owner: | Brian || || Researched by: | || || Narrative: | Jira tickets are normally used to approve and track network changes\\ || || Artifacts: | Jira.bccampus.ca\\ || || Recommendation: | Need to update policy that no Jira = no change\\ || || Proposed Remedy(ies): | || || Approved Remedy(ies): | || || Date: | || || Reviewed by: | || || Remarks/comments: | || 
    {cloak}## h5. Current network diagrams with all connections to cardholder data, including any wireless networks? 
    {toggle-cloak:id=1.1.2}{tree-plus-icon} *Compliance:* {color:red}{*}TBD{*}{color} (?) 
    {cloak:id=1.1.2}
    

     requirement_num
     -----------------
     1.1.1
     1.1.2
     1.1.3
    

    我正在考虑使用工会-有人有更好的建议吗?

    忘了提:

    • 数字不是顺序的。当前记录从1.1.6跳到1.2.1
    • {toggle-cloak:id=x.y.z} {cloak:id=x.y.z} . 我感兴趣的是 {斗篷:id=x.y.z} {cloak} 标签。
    2 回复  |  直到 15 年前
        1
  •  2
  •   tloflin    15 年前

    我可能会为此使用一个函数。比如:

    create function [dbo].[getCloaks]
    (
    @String     varchar(8000)
    )
    returns @tbl table (s varchar(1000))
    as
    begin
    declare @i int, @j int, @k int
        select  @i = 1
        while charindex('{cloak:id=', @String, @i) > 0
        begin
            select @j = charindex('{cloak:id=', @String, @i)
            select @k = charindex('}', @String, @j)
            insert  @tbl select substring(@String, @j + 10, @k - @j - 10)
            select  @i = @k + 1
        end
        return
    end
    
        2
  •  1
  •   Aaronaught    15 年前

    DECLARE @Data nvarchar(1000)
    
    SET @Data = N'...{cloak:id=1.1.1}...{cloak}...{cloak:id=1.1.2}...{cloak}...' +
                N'{cloak:id=1.1.3}...{cloak}...'
    
    ;WITH Cloak_CTE AS
    (
        SELECT
            CAST(NULL AS nvarchar(50)) AS requirement_num,
            CHARINDEX('{cloak:id=', @Data) AS start_index,
            CHARINDEX('}', @Data, CHARINDEX('{cloak:id=', @Data)) AS end_index
    
        UNION ALL
    
        SELECT
            CAST(SUBSTRING(@Data, start_index + 10,
                end_index - start_index - 10) AS nvarchar(50)),
            CHARINDEX('{cloak:id=', @Data, end_index + 1),
            CHARINDEX('}', @Data, CHARINDEX('{cloak:id=', @Data, end_index + 1))
        FROM Cloak_CTE
        WHERE start_index > 0
    )
    SELECT requirement_num
    FROM Cloak_CTE
    WHERE requirement_num IS NOT NULL
    

    对于多行或不同模式的调整应该相对简单,或者将其放入一个内联的UDF中。