我正在使用SSMS 2008,我有以下表函数来获取文本字符串并从Microsoft Word中删除所有元标记。标签包含在“< ...>”中并且一列中可以有任意数量的标签/记录。
我创建了这个表函数来更新这一列中的每一行。
alter function dbo.ufn_StripHTML
( @Input varchar(8000),
@Delimiter char(1)
)
returns varchar(8000)
as
begin
declare @Output varchar(8000)
select @Input = replace(replace(@input, '<', @Delimiter), '>', @Delimiter)
select @Output = isnull(@Output, '') + s
from ( select row_number() over (order by n.id asc) [i],
substring(@Delimiter + @Input + @Delimiter, n.id + 1, charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.id + 1) - n.id - 1) [s]
from [evolv_cs].[dbo].[progress_note] n
where n.id = charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.id) and
n.id <= len(@Delimiter + @Input)
) d
where i % 2 = 1
return @Output
end
如果[progress_note]具有“id”int列,则此表函数将起作用。但它没有,我也无法通过添加int列来修改此表。所以问题是我试图在临时表上使用这个函数。
所以我尝试基于这个表创建一个视图,然后向它添加一个PK int列。因为当我尝试使用这个额外的PK int列(“id”)创建视图时,它给了我一个错误:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'identity'.
但是ALTER VIEW不支持添加列。还有另一种方法吗?这是我试图修改的原始临时表:
select [progress_note].[note_text], [progress_note].[event_log_id]
INTO #TEMP_PN
from [evolv_cs].[dbo].[progress_note]
group by [progress_note].[event_log_id], [progress_note].[note_text]
[note_text]是varchar(max),event_log_id是uniqueidentifier。所以[note_text]包含一堆“&lt;”和“&gt;”字符。如何修改此dbo.ufn_StripHTML函数?
当然,如果我尝试用表函数中的#TEMP_PN替换[progress_note]表,它将会出错,因为它无法识别它。那么如何根据我的情况修改此功能呢?
答案 0 :(得分:0)
我刚才写了一个函数来做这件事。我鼓励你至少尝试一下。
Create Function dbo.StripHTML(@HTML VarChar(max))
Returns VarChar(Max)
As
Begin
While @HTML Like '%[<]%'
Set @HTML = Stuff(@HTML, PatIndex('%[<]%', @HTML), CharIndex('>', @HTML, PatIndex('%[<]%', @HTML))-PatIndex('%[<]%', @HTML)+1, '')
Set @HTML = Replace(@HTML, ' ', ' ')
Set @HTML = Replace(@HTML, '<', '<')
Set @HTML = Replace(@HTML, '>', '>')
Set @HTML = Replace(@HTML, '"', '"')
Set @HTML = Replace(@HTML, '&', '&')
Return LTrim(RTrim(@HTML))
End
您可以像这样调用函数:
Select dbo.StripHTML('<p>This is some text</p>')
或
Select dbo.StripHTML(ColumnNameHere) From TableNameHere