SQL Server使用PatIndex查找字符的位置,只知道模式的开始和结束

时间:2017-07-13 09:18:12

标签: sql sql-server sql-server-2008

是否可以使用patIndex查找字符位置,只知道存储在varchar中的模式的开头和结尾?

我尝试过使用此功能,但它会返回' 0'每次

select @emptyTag= patindex('<span%></span',@pmReportText)

下面是varchar(@pmReportText)的一个小片段,我想用红色标记的位置,图案标记为绿色(第一个字符为红色) varchar snippet

Varchar Sample as Text: <span style="font-size: 14pt;"><b><span style="font-size: 14pt;"><b><span style="font-size: 14pt;"><b><span style="font-size: 14pt;"><span style="font-size: 14pt;"></span>

注意: 我需要这样做的原因是从由于RadEditor错误而插入的db条目中删除空标记。标签中可以有不同的长度样式,这就是我不知道长度的原因。我需要保留RadEditor文本样式,否则我会删除所有HTML。 varchar包含超过128个级别,因此我无法使用xml。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是获取字符串拆分例程,然后拆分字符串&#39;&gt;&lt;&#39;上的所有文本。这将为您提供一个字符串列表,这些字符串可以使用更简单的代码集进行解析。例如,假设您将拆分器的输出放入临时表#tmp(创意命名!)。然后,让我们编写一些解析代码,不做任何关于字符串的假设。

首先要注意的一点是:当你以这种方式使用字符串拆分器时,你应该在结束字符和起始字符之间放置一个换行符(如果使用单个字符串,则应该在拆分字符串之后),而不是用一行代替它们打破。这提高了解析代码的效率。

我假设临时表结构是:

CREATE TABLE #tmp (id int identity primary key, data varchar(max))

识别空跨度的代码是:

SELECT *
FROM #tmp t1
INNER JOIN #tmp t2
    ON t1.id = t2.id - 1
WHERE t2.data LIKE '</Span>%'
    AND t1.data LIKE '%<Span%>' -- Is the startspan in this string?
    AND RIGHT(t1.data, 1) = '>' Is a tag at the end of the string
    -- Is there not another close tag after the last Span starts?
    AND (SUBSTRING(t1.data, Len(t1.data) - (CHARINDEX(REVERSE(t1.data), 'napS<') + 4, LEN(t1.data) NOT LIKE '%>%>' 

希望这会有所帮助。