Как изменить табличную функцию TSQL Replace для моего случая? - PullRequest
1 голос
/ 24 октября 2011

Я использую 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] содержал int столбец id. Но это не так, и я не могу изменить эту таблицу, добавив столбец 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 - это уникальный идентификатор. Поэтому [note_text] содержит несколько символов "<" и ">". Как я могу изменить эту функцию dbo.ufn_StripHTML?

Конечно, если я попытаюсь заменить таблицу [progress_note] на #TEMP_PN в табличной функции, она выдаст ошибку, потому что не распознает ее. Итак, как я могу изменить эту функцию для моего случая?

1 Ответ

0 голосов
/ 24 октября 2011

Я недавно написал функцию для этого.Я рекомендую вам хотя бы попробовать.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...