SQL 2000データベースのテキストフィールドで文字列置換を行う必要があるという古典的な問題に遭遇しました。これは、列全体の更新である場合も、私が煩わしくない単一のフィールドである場合もあります。
Updatetextを使用してそれを達成する方法の例をいくつか見つけましたが、それらはストアドプロシージャに含まれる傾向があり、関数にラップされている同様のことを誰かが知っているので、通常Replace()を使用するように使用できます。知らない人のためのReplace()関数の問題は、テキストフィールドをサポートしていないことです。
編集:私はおそらくvarchar(8000)で済む可能性があることに気づいたので、問題を修正するためにフィールドをこのタイプにスワップしました。私は真の解決策を見つけられませんでした。
関数内では実行できません
次のような関数を宣言しようとすると、
create function dbo.textReplace(
@inText as text)
returns text
as
begin
return 'a' -- just dummy code
end
次のエラーが発生します。
The text data type is invalid for return values.
言い換えれば、テキストデータ型のREPLACE関数に相当する単純なものを作成することはできません。
REPLACE関数を使用してテキスト列でテーブルを更新するサンプルクエリを次に示します。これがあなたに役立つことを願っています。
UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext')
WHERE <Condition>
これは、このシナリオの私のコードスニペットです。
DECLARE @oldtext varchar(1000)
DECLARE @newtext varchar(1000)
DECLARE @textlen int
DECLARE @ptr binary(16)
DECLARE @pos int
DECLARE @id uniqueidentifier
SET @oldtext = 'oldtext'
SET @newtext = 'newtext'
SET @textlen = LEN(@oldtext)
DECLARE mycursor CURSOR LOCAL FAST_FORWARD
FOR
SELECT [UniqueID]
,TEXTPTR([Text])
,CHARINDEX(@oldtext, [Text]) - 1
FROM [dbo].[myTable]
WHERE [Text] LIKE '%' + @oldtext +'%'
OPEN mycursor
FETCH NEXT FROM mycursor into @id, @ptr, @pos
WHILE @@fetch_status = 0
BEGIN
UPDATETEXT [dbo].[myTable].Text @ptr @pos @textlen @newtext
FETCH NEXT FROM mycursor into @id, @ptr, @pos
END
CLOSE mycursor
DEALLOCATE mycursor
テキスト値を渡すとvarcharを返すSUBSTRING()関数を使用することもできます。
例えば:
MyVarchar = SUBSTRING(myTextField, 1, DATALENGTH(myTextField))
Varcharに特定の長さを設定している場合は、次のように切り詰めることができます。
MyVarchar100 = SUBSTRING(myTextField, 1, 100)
Ntextフィールドを置き換える場合は、テキストフィールドをvarchar(8000)またはnvarchar(4000)にキャストする必要があります。
MyField = REPLACE(CAST(MyField as VARCHAR(4000))、 "string1"、 "string2")
このコースは、フィールドのコンテンツの長さが</ 4000/8000文字以下であることを保証できる場合にのみ機能します。