web-dev-qa-db-ja.com

テキストフィールドのt-sql置換

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

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

編集:私はおそらくvarchar(8000)で済む可能性があることに気づいたので、問題を修正するためにフィールドをこのタイプにスワップしました。私は真の解決策を見つけられませんでした。

29
PeteT

関数内では実行できません

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

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関数に相当する単純なものを作成することはできません。

3
kristof

REPLACE関数を使用してテキスト列でテーブルを更新するサンプルクエリを次に示します。これがあなたに役立つことを願っています。

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
48
suryakiran

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

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
4
bitsprint

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

例えば:

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

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

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
1

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

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

このコースは、フィールドのコンテンツの長さが</ 4000/8000文字以下であることを保証できる場合にのみ機能します。

1
Craig Bovis