2011-10-22 3 views
1

SSMS 2008을 사용하고 있으며 다음과 같은 스칼라 기능을 사용하여 텍스트 문자열을 가져와 Microsoft Word에서 모든 메타 태그를 제거합니다. 태그는 "< ...>"로 묶여 있으며 하나의 열에 여러 개의 태그/레코드가있을 수 있습니다.TSQL 바꾸기 테이블 함수를 만드는 방법은 무엇입니까?

이 열의 각 행을 업데이트하려면 아래 코드를 기반으로 스칼라 함수를 만들었습니다. 그러나이 스칼라 함수는 완료하는 데 오랜 시간이 걸립니다. 이 테이블 함수 버전이 더 빠를까요? 그렇다면이 함수를 테이블로 만들기 위해 어떻게 다시 작성할 수 있습니까?

WHILE PATINDEX('%[%]%', @str) > 0 
    SET @str = REPLACE(@str, SUBSTRING(@str, 
      PATINDEX('%[%]%', @str), 1), '') 
SELECT @str 

이 테이블 함수는 거의 작동합니다. 그러나 그것이 지금은 효과가 없다는 것이 밝혀졌습니다. 문제는 임시 테이블에서이 함수를 사용하려고한다는 것입니다. 원래 테이블에는 int PK가 없으므로 원본 테이블에 열을 추가 할 수 없습니다.

그래서이 테이블을 기반으로보기를 만든 다음 PK int 열을 추가하려고했습니다. 나는이 추가 PK의 INT 컬럼 ("N")와보기를 만들려고 할 때, 그것은 나에게 오류 준 때문에 :

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 (최대) 및 event_log_id입니다 고유 식별자. 따라서 [note_text]에는 "<"및 ">"문자가 포함되어 있습니다. 이 dbo.ufn_StripHTML 함수를 어떻게 수정할 수 있습니까?

나는 최신 코드를 시험해 보았는데 이것은 초고속 !! 그러나 5700 행을 통과 한 후에 다음과 같은 오류가 발생했습니다.

Msg 537, Level 16, State 2, Line 1 
Invalid length parameter passed to the LEFT or SUBSTRING function. 

이 항목에 대해 알고 계십니까?

+1

SQL 서버 CLR 고려해야하는 옵션입니다. –

+0

note_text 길이가> 내가 제공 한 500 가지 테스트 예제보다 Number 테이블에 더 많은 행이 필요할 수 있습니다. 또한 내 varchar (8000) -> max를 수정 한 후 테스트해야합니다. 자세한 내용은 여기를 읽어보십시오 -> http://www.sqlservercentral.com/articles/T-SQL/62867/ –

답변

1

Heres HTML 태그 (짝수 < ...> 쌍)를 제거하기 위해 썼다. 나는 Word 메타 태그를 없애기 위해 용도 변경이 가능한지 알고 싶다.

----------------------------------------------------------- 
-- 1. create a number table (this is just a utility table) 
----------------------------------------------------------- 
set nocount on; 
if object_id('dbo.Number') is not null 
begin 
    drop table dbo.Number; 
end 
go 

create table dbo.Number (n int identity(1,1) primary key); 

insert dbo.Number default values ; 
while scope_identity() < 500 
    insert dbo.Number default values ; 

----------------------------------------------------------- 
-- 2. create the function (leverages the utility table) 
----------------------------------------------------------- 
if object_id('dbo.ufn_StripHTML') is not null 
begin 
    drop function dbo.ufn_StripHTML; 
end 
go 
create 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.n asc) [i], 
       substring(@Delimiter + @Input + @Delimiter, n.n + 1, charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n + 1) - n.n - 1) [s] 
      from dbo.Number n 
      where n.n = charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n) and 
       n.n <= len(@Delimiter + @Input) 
      ) d 
    where i % 2 = 1 

    return @Output 

end 
go 

----------------------------------------------------------- 
--3. Example of calling the function when you query 
----------------------------------------------------------- 
if object_id('tempdb..TEMP_PN') is not null 
    drop table #TEMP_PN; 

create table #TEMP_PN (note_text varchar(max), event_log_id int); 

insert into #TEMP_PN 
    select '<b>Some very large bolded text here!</b>', 1 union all 
    select 'no tags here', 2 union all 
    select '<html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>', 3 

select [Strip] = dbo.ufn_StripHTML(note_text, '|'), 
     [Orig] = note_text, 
     event_log_id 
from #TEMP_PN 

편집 : 테이블에 이식 스칼라

alter function dbo.ufn_StripHTMLTable 
    ( @Input  varchar(8000), 
     @Delimiter char(1) 
    ) 
returns @ret table (OutString 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.n asc) [i], 
         substring(@Delimiter + @Input + @Delimiter, n.n + 1, charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n + 1) - n.n - 1) [s] 
       from dbo.Number n 
       where n.n = charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n) and 
         n.n <= len(@Delimiter + @Input) 
      ) d 
    where i % 2 = 1; 

    insert into @ret 
     values(@Output); 

    return; 
end 
+0

감사! 나는 궁금하다 - @ 델리게이트는 무엇을 위해 사용 되는가? – salvationishere

+0

구문 분석 할 데이터에없는 문자 만 입력하면됩니다. 파이프를 사용하지만, 데이터를 구성 할 수있는 파이프가있는 경우를 대비하여 –

+0

안녕하세요, Nathan, 제발 내 질문에 한 번 더보세요. 제발 업데이트하나요? – salvationishere

관련 문제