31

SQL2000データベースのテキストフィールドで文字列の置換を行う必要があるという古典的な問題に遭遇しました。これは、列全体の更新か、私が煩わしくない単一のフィールドのいずれかである可能性があります。

updatetextを使用してそれを実現する方法の例をいくつか見つけましたが、それらはストアドプロシージャに含まれる傾向があります。関数にラップされている同様のことを知っている人はいるので、通常のReplace()を使用するのと同じように使用できます。知らない人のためのReplace()関数の問題は、テキストフィールドをサポートしていないことです。

編集:私はおそらくvarchar(8000)でうまくいく可能性があることに気付いたので、フィールドをこのタイプに交換して問題を修正しました。私は本当の解決策を見つけたことはありません。

4

5 に答える 5

52

これは、REPLACE関数を使用してテキスト列でテーブルを更新するためのサンプルクエリです。これがお役に立てば幸いです。

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
于 2009-10-26T08:52:18.383 に答える
4

これは、このシナリオのコード スニペットです。

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
于 2008-11-20T08:32:56.697 に答える
4

関数内でそれを行うことはできません

次のような関数を宣言しようとすると:

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 関数に相当する単純な関数を記述できませんでした。

于 2008-11-14T11:11:49.453 に答える
1

テキスト値が渡されたときに varchar を返す SUBSTRING() 関数を使用することもできます。

例えば:

MyVarchar = SUBSTRING(myTextField, 1, DATALENGTH(myTextField))

特定の長さの varchar を入力している場合は、収まるように切り詰めることができます。

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
于 2009-08-13T19:22:00.147 に答える
1

ntext フィールドを置き換える場合は、テキスト フィールドを varchar(8000) または nvarchar(4000) にキャストする必要があります。

MyField = REPLACE(CAST(MyField as VARCHAR(4000)), "string1", "string2")

これはもちろん、フィールドの内容の長さが 4000/8000 文字以下であることを保証できる場合にのみ機能します。

于 2009-02-16T00:29:44.963 に答える