2011-10-24 81 views
1

我正在使用SSMS 2008,我有下面的表函數來獲取文本字符串並從Microsoft Word中刪除所有元標記。標籤包含在「< ...>」中,並且在一列中可以有任意數量的標籤/記錄。如何修改TSQL替換表格函數爲我的情況?

我創建了此表函數來更新此列中的每一行。

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] is varchar(max)and event_log_id is uniqueidentifier。因此[note_text]包含一串「<」和「>」字符。我如何修改這個dbo.ufn_StripHTML函數?

當然,如果我嘗試在表函數中用#TEMP_PN替換[progress_note]表,它將導致錯誤導致它無法識別它。那麼我怎樣才能修改這個功能呢?

回答

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, '&nbsp;', ' ') 
    Set @HTML = Replace(@HTML, '&lt;', '<') 
    Set @HTML = Replace(@HTML, '&gt;', '>') 
    Set @HTML = Replace(@HTML, '&quot;', '"') 
    Set @HTML = Replace(@HTML, '&amp;', '&') 

    Return LTrim(RTrim(@HTML)) 
End 

你會調用該函數是這樣的:

Select dbo.StripHTML('<p>This is some text</p>') 

Select dbo.StripHTML(ColumnNameHere) From TableNameHere 
+0

這是一臺功能? – salvationishere

+0

沒有。這是一個標量udf。 –

+0

我更新了代碼。有一個小的複製/粘貼錯誤。我還添加了示例用法。 –

相關問題