SQL通配符到RegExp替换列内容中的某些文本

时间:2015-06-29 08:11:58

标签: sql sql-server regex sql-server-2012

我有一张表,其中一列的文字与HTML数据混合在一起。这是由于脚本中的错误(已修复),但需要编辑SQL数据以反映更改。该列的类型为nvarchar(max, null)。我需要做的就是找到<a img="lkss"><div attr=val>等标记,并用空字符串""替换它们。我查看了this,但解决方案说明了如何根据一种模式替换整个内容。我的问题是我需要部分替换内容,但保留干净的文本(即不是HTML标签/属性)。任何建议/帮助表示赞赏。

测试列数据:

<div attr=val; color=somecolor>inside text<div some=val><a some=val>Inside anchor

预期结果:

inside textInside anchor

1 个答案:

答案 0 :(得分:1)

我使用这样的CTE:

DECLARE @str nvarchar(max) = '<div attr=val; color=somecolor>inside text<div some=val><a some=val>Inside anchor';

WITH CTE(myStr) AS (
    SELECT @str
    UNION ALL
    SELECT REPLACE(mystr, SUBSTRING(myStr, CHARINDEX('<', myStr, 1),  CHARINDEX('>', myStr, 1) - CHARINDEX('<', myStr, 1) + 1), '')
    FROM CTE
    WHERE PATINDEX('%<%>%',myStr) > 0
)
SELECT myStr
FROM CTE
WHERE PATINDEX('%<%>%',myStr) = 0

我建议你在这样的SVF中使用它:

CREATE FUNCTION tagRemover 
(
    @str nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @ResultVar nvarchar(max);
    SELECT @ResultVar = @str;

    ;WITH CTE(myStr, id) AS (
        SELECT @str, 1
        UNION ALL
        SELECT REPLACE(mystr, SUBSTRING(myStr, CHARINDEX('<', myStr, 1),  CHARINDEX('>', myStr, 1) - CHARINDEX('<', myStr, 1) + 1), ''), id + 1
        FROM CTE
        WHERE PATINDEX('%<%>%',myStr) > 0
    )
    SELECT @ResultVar = myStr
    FROM CTE
    WHERE PATINDEX('%<%>%',myStr) = 0;

    RETURN @ResultVar;
END
GO