2011-10-25 11 views
1

私はSSMS 2008を使用しており、次のスカラー関数を使用してテキスト文字列を取り、Microsoft Wordからすべてのメタタグを削除します。タグは "< ...>"で囲まれており、1つの列に任意の数のタグ/レコードが存在できます。Tsqlスカラー関数を表関数に変換する方法は?

このスカラー関数を作成してこの列の各行を更新しました。

create function dbo.ufn_StripHTML 
    ( @Input  varchar(max), 
     @Delimiter char(1) 
    ) 
returns varchar(max) 
as 

begin 

    declare @Output varchar(max) 
    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型(最大)とevent_log_idですUNIQUEIDENTIFIER。だから[note_text]には "<"と ">"という文字列が含まれています。この関数をテーブル関数に変更するにはどうすればよいですか?

もちろん、この関数で[progress_note]テーブルを#TEMP_PNに置き換えようとすると、それを認識できないためエラーになります。どうすれば私の場合にこの機能を変更できますか?

一方、テーブルパラメータを受け入れて出力するテーブル関数を開発しました。それはエラーではありませんが、私が望んでいた解析されたデータは返されません。何が欠けている?

CREATE TYPE dbo.MyTableType AS TABLE 
(
    col1 int identity(1,1) NOT NULL, 
    col2 varchar(max) NULL 
) 
GO 

CREATE TABLE [dbo].[MyTable] (
    [col1] [int] identity(1,1) NOT NULL, 
    [col2] [varchar](max) NULL 
    ) 
GO 

create PROC usp_AddRowsToMyTable @MyTableParam MyTableType READONLY, @Delimiter varchar(30) 
    as 
    INSERT INTO MyTable([col2]) 
    SELECT [col2] 
    FROM @MyTableParam 

    --update MyTable 
    --set col2 = replace(replace(MyTable.col2, '<', @Delimiter), '>', @Delimiter) 
    select s, i, t 
    from(
    select MyTableInput.col1 [i], 
    replace(replace(MyTable.col2, '<', @Delimiter), '>', @Delimiter) as t, 
    substring(@Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1 + 1, 
    charindex(@Delimiter, @Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1 + 1) - MyTable.col1 - 1) [s] 
    from MyTable 
    inner join MyTable as MyTableInput on MyTable.col1 = MyTableInput.col1 
    where MyTable.col1 = CHARINDEX(@Delimiter, @Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1) 
    and MyTable.col1 <= LEN(@Delimiter + MyTableInput.col2) 
) d 


DECLARE @MyTable MyTableType 

INSERT INTO @MyTable(col2) 
VALUES ('<h><dsf>2000<h><dsf>'), 
    ('<sd><dsf>2001'), 
    ('2002<vnv><dsf>'), 
    ('<gsd><dsf>2003<h><dsf>'), 
    ('<eefs><dsf><h><dsf>2004<dfgd><dsf>') 

EXEC dbo.usp_AddRowsToMyTable @MyTableParam = @MyTable, @Delimiter = '|' 
+0

この存在しない 'id'カラムの意味は何ですか?あなたのスカラー関数では、 'CHARINDEX'の結果と' LEN'の結果とを比較しています。この列はどのような価値を表していますか?つまり、「身分証明書」の意味でのIDではないのですか? –

答えて

1

ない私はあなたの質問を理解することが、ここでは(それが表値関数と呼ばれる)は、テーブルを返すように、あなたの機能を変更する方法をされています確認してください:

create function dbo.ufn_StripHTML 
    ( @Input  varchar(max), 
     @Delimiter char(1) 
    ) 
returns @retYourNewTable table 
(
    id int primary key clustered not null, 
    yoursecond column varchar(100) null, 
    .... 
) 
as 
.... 

はこれですあなたは何を探していますか?

+0

OPは構文上の問題ではなく、問題の機能的な解決策を探しています。これが彼が探しているものだとは思わないでください。 – Kash

+0

Kashは正しいです。私は機能的なソリューションを探しています。更新された説明をご覧ください。 – salvationishere

関連する問題