2013-07-11 35 views
1

基本上我在我的代码中有一个错误,导致条目保存到数据库中的HTML中。我纠正了代码,所有未来的条目都是正确的,但是我想通过数据库运行一次并更正所有以前的条目。我发现这个功能在这个论坛上做到这一点:从列中剥离HTML而不使用函数?

CREATE FUNCTION [dbo].[udf_StripHTML] (@HTMLText VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS 
BEGIN 
DECLARE @Start INT 
DECLARE @End INT 
DECLARE @Length INT 
SET @Start = CHARINDEX('<',@HTMLText) 
SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
SET @Length = (@End - @Start) + 1 
WHILE @Start > 0 AND @End > 0 AND @Length > 0 
BEGIN 
    SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'') 
    SET @Start = CHARINDEX('<',@HTMLText) 
    SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
    SET @Length = (@End - @Start) + 1 
END 

不过,我想这样做没有,因为我只使用这个曾经创造一个功能,而DBA不希望我把任何东西在数据库。我怎么能在UDF之外工作?我不太熟悉SQL。

我的代码:

Update [OrderItem] 
set [Description] = --??? Description without the HTML 
from [Order] o inner join [OrderItem] oi on o.OrderID = oi.OrderID 
+1

一串丑陋的Replace()括号剥去了最常见的标记吗?即'替换(替换(替换([描述],'',''),'
',''),'','') – PowerUser

+0

^您仍然在使用一个功能:D –

+0

@DanyKhalife ,是的,但它不是存储在数据库中的UDF。这是重要的事情。 – PowerUser

回答

0

只需删除CREATE FUNCTION标签即可轻松完成此操作。尝试在SSMS中运行它。

DECLARE @HTMLText VARCHAR(MAX) 
SET @HTMLText = '<html><head><title>this is title</title></head><body>this is text</body></html>' 

DECLARE @Start INT 
DECLARE @End INT 
DECLARE @Length INT 
SET @Start = CHARINDEX('<',@HTMLText) 
SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
SET @Length = (@End - @Start) + 1 
WHILE @Start > 0 AND @End > 0 AND @Length > 0 
BEGIN 
    SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'') 
    SET @Start = CHARINDEX('<',@HTMLText) 
    SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
    SET @Length = (@End - @Start) + 1 
END 

select @HTMLText 
0

我从来没有这样做过,但如果要我,这里的丑陋的选择。首先,将数据转储到临时表@Tmp中。然后,使用一系列的更新语句:

Update @Tmp set Description=Replace(Description,'<html>','') 
Update @Tmp set Description=Replace(Description,'</html>','') 
Update @Tmp set Description=Replace(Description,'<table>','') 
Update @Tmp set Description=Replace(Description,'</table>','') 

这将是相对易于维护/添加/删除标记。由于它们都是明确定义的,最难的部分是事先知道需要剥离的东西。