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