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