Sql g我在想的台词。我会尝试一下,并让你知道。嗨,DK,我一直在试验上面的代码,并能够得到这个代码产生的结果。我现在运行的是:SELECT tekst,CHARINDEX('正如您所看到的,为了测试目的,我将查询限制为一条记录。发生的情况是,它在记录中查找di

Sql g我在想的台词。我会尝试一下,并让你知道。嗨,DK,我一直在试验上面的代码,并能够得到这个代码产生的结果。我现在运行的是:SELECT tekst,CHARINDEX('正如您所看到的,为了测试目的,我将查询限制为一条记录。发生的情况是,它在记录中查找di,sql,sql-server,Sql,Sql Server,g我在想的台词。我会尝试一下,并让你知道。嗨,DK,我一直在试验上面的代码,并能够得到这个代码产生的结果。我现在运行的是:SELECT tekst,CHARINDEX('正如您所看到的,为了测试目的,我将查询限制为一条记录。发生的情况是,它在记录中查找div的第一个实例,然后成功地将其删除。但有两个问题:1)记录包含多个实例(但我可以多次运行该查询以将其全部删除);2)当我重复该查询时,在某个点上,它将用完div并开始删除记录的前六个字符(可能来自代码中的+6)。当没有更多的div时,我如何告诉


g我在想的台词。我会尝试一下,并让你知道。嗨,DK,我一直在试验上面的代码,并能够得到这个代码产生的结果。我现在运行的是:
SELECT tekst,CHARINDEX('正如您所看到的,为了测试目的,我将查询限制为一条记录。发生的情况是,它在记录中查找div的第一个实例,然后成功地将其删除。但有两个问题:1)记录包含多个实例(但我可以多次运行该查询以将其全部删除);2)当我重复该查询时,在某个点上,它将用完div并开始删除记录的前六个字符(可能来自代码中的+6)。当没有更多的div时,我如何告诉查询不要删除任何内容?可以添加where子句以确保只清除有问题的行:where html(如“%”和html(如“%”)
UPDATE ContentTable SET ContentColumn=dbo.PatternReplace('<DIV>%</DIV>', '')
CREATE TABLE #temp(id INT IDENTITY, html VARCHAR(MAX));

INSERT #temp(html)
VALUES('<p>Some text</p><strong>other text</strong><div>added by hacker</div>')
,('<p>Some text</p><strong>other text<div>added by hacker within html tag</div></strong>')
,('<p>Some text</p><div>some other text added by <a href="http://google.com">hack</a></div><strong>other text</strong>');


SELECT html
,  CHARINDEX('<div',html) AS startPos
, CHARINDEX('</div>',html) AS endPos
, (CHARINDEX('</div>',html)+6)-(CHARINDEX('<div',html)) AS stringLenToRemove
, SUBSTRING(html, CHARINDEX('<div',html), (CHARINDEX('</div>',html)+6)-(CHARINDEX('<div',html))) AS HtmlAddedByHack
,REPLACE(html,SUBSTRING(html, CHARINDEX('<div',html), (CHARINDEX('</div>',html)+6)-(CHARINDEX('<div',html))), '') AS sanitizedHtml
FROM #temp;

--UPDATE #temp
--SET html = REPLACE(html,SUBSTRING(html, CHARINDEX('<div',html), (CHARINDEX('</div>',html)+6)-(CHARINDEX('<div',html))), '');

--SELECT  *
--FROM    #temp;
Declare @ColumnName sysname , @TableName sysname 
        ,@Schema sysname , @Sql Nvarchar(MAX);

Declare Cur CURSOR FOR 
Select c.name , t.name , s.name
from sys.columns c 
inner join sys.tables  t on c.object_id = t.object_id
inner join sys.types   p on p.user_type_id = c.user_type_id
inner join sys.schemas s on t.schema_id = s.schema_id
where t.is_ms_shipped = 0
and p.name in ('varchar','nvarchar', 'char', 'nchar')

OPEN Cur 

 FETCH NEXT FROM Cur INTO @ColumnName , @TableName , @Schema

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Sql = N'UPDATE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(@TableName) 
             + N' SET ' + QUOTENAME(@ColumnName) + N' = '
             + N'LEFT(' + QUOTENAME(@ColumnName) + N', CHARINDEX(''<div>'', 
                          ' + QUOTENAME(@ColumnName) + N') - 1) 
                      + SUBSTRING(' + QUOTENAME(@ColumnName) + N', 
                      CHARINDEX(''</div>'', ' + QUOTENAME(@ColumnName) + N') + 6
                      , LEN(' + QUOTENAME(@ColumnName) + N'))
                Where ' + QUOTENAME(@ColumnName) + N' IS NOT NULL 
                AND LEN(' + QUOTENAME(@ColumnName) + N') > 6' 

     Exec sp_executesql @Sql 

     FETCH NEXT FROM Cur INTO @ColumnName , @TableName , @Schema
END 

CLOSE Cur 
DEALLOCATE Cur