我先从网上搜了一个函数,把HTML语法过滤的
CREATE function dbo.htmlguolv

@vstrIn varchar(1000) 

returns varchar(4000) 
as 
begin 
declare @strReturn varchar(4000) ,
@str varchar(4000) ,
@stmp varchar(1),
@i int ,
@len int set @strReturn='' 
select @str=stuff(@str,1,2,'') 
set @len=len(@str) 
set @i=1 while @i<@len 
begin 
set @stmp = substring(@str,@i,1) 
set @stmp = replace(@stmp,'<','<') 
set @stmp = replace(@stmp,'>','>') 
set @strReturn = @strReturn + @stmp 
set @i=@i+1 
end 
return @strReturn 
end结果运行时显示:不允许从数据类型 ntext 到 varchar 的隐性转换。请使用 CONVERT 函数来运行此查询。一看,原来我的数据库是NTEXT的,所以不行,于是我就转换
select dbo.htmlguo(convert(varchar(8000),context)) from lc_newsinfo结果选择出来了,但是context字段数据内容全为空了!!!!!!!
========
哪个老大给个过滤HTML的函数,能过滤NTEXT的,谢谢了

解决方案 »

  1.   

    replace函數不在用在text, ntext類型的字段上
      

  2.   

    注:里面不止是<br><p>这样的简单语法,所有HTML的语法还有STYLE都有,例如<TABLE style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-al能过滤掉所有的html和css语法么?
      

  3.   

    --text字段替换处理示例
    --邹建 2005.04(引用请保留此信息)--测试数据
    CREATE TABLE tb(col ntext)
    INSERT tb VALUES(REPLICATE( '0001,0002,0003,0004,0005,0006,0007,0008,0009,0100,'
    +'220000001,302000004,500200006,700002008,900002120,',800))
    DECLARE @p binary(16)
    SELECT @p=TEXTPTR(col) FROM tb
    UPDATETEXT tb.col @p NULL 0 tb.col @p
    GO--替换处理定义
    DECLARE @s_str nvarchar(1000),@r_str nvarchar(1000)
    SELECT @s_str='00'  --要替换的字符串
    ,@r_str='0000'  --替换成该字符串DECLARE @p varbinary(16)
    DECLARE @start int,@s nvarchar(4000),@len int
    DECLARE @s_len int,@step int,@last_repl int,@pos int--替换处理参数设置
    SELECT 
    --用于要判断每次截取数据,最后一个被替换数据位置的处理
    @s_len=LEN(@s_str), --设置每次应该截取的数据的长度,防止REPLACE后数据溢出
    @step=CASE WHEN LEN(@r_str)>LEN(@s_str)
    THEN 4000/LEN(@r_str)*LEN(@s_str)
    ELSE 4000 END--替换处理的开始位置
    SELECT @start=PATINDEX('%'+@s_str+'%',col),
    @p=TEXTPTR(col),
    @s=SUBSTRING(col,@start,@step),
    @len=LEN(@s),
    @last_repl=0
    FROM tb
    WHERE PATINDEX('%'+@s_str+'%',col)>0
    AND TEXTVALID('tb.col',TEXTPTR(col))=1
    WHILE @len>=@s_len
    BEGIN
    --得到最后一个被替换数据的位置
    WHILE CHARINDEX(@s_str,@s,@last_repl)>0
    SET @last_repl=@s_len
    +CHARINDEX(@s_str,@s,@last_repl) --如果需要,更新数据,同时判断下一个取数位置的偏移量
    IF @last_repl=0
    SET @last_repl=@s_len
    ELSE
    BEGIN
    SELECT @last_repl=CASE
    WHEN @len<@last_repl THEN 1
    WHEN @len-@last_repl>=@s_len THEN @s_len 
    ELSE @len-@last_repl+2 END,
    @s=REPLACE(@s,@s_str,@r_str),
    @pos=@start-1
    UPDATETEXT TB.col @p @pos @len @s
    END
    --获取下一个要处理的数据
    SELECT @start=@start+LEN(@s)-@last_repl+1,
    @s=SUBSTRING(col,@start,@step),
    @len=LEN(@s),
    @last_repl=0
    FROM tb
    END
    GO--显示处理结果
    SELECT datalength(col),* FROM tb
    DROP TABLE tb
      

  4.   

    因为sql 2000中, 无法直接操作ntext参数, 所以应该无法直接修改为函数如果楼主已经升级到sql 2005了, 则只需要把ntext列转换为nvarchar(max)类型就可以直接用replace了