0

必要なのは、テーブルの特定の列(データ型:)で文字列を検索し、textそれを別のテキストに置き換えることです。

例えば

Id          |          Text
-----------------------------
1                   this is test
2                   that is testosterone

テストをクイズに置き換えることを選択した場合、結果は次のようになります。

this is quiz
that is quizosterone

私がこれまでに試したことは何ですか?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[SearchAndReplace] 
(
     @FindString    NVARCHAR(100)
    ,@ReplaceString NVARCHAR(100)
)
AS
BEGIN
    SET NOCOUNT ON
SELECT CONTENT_ID as id, CONTENT_TEXT, textptr(CONTENT_TEXT) as ptr, datalength(CONTENT_TEXT) as lng
 INTO #newtable6  FROM HTML_CONTENTS 
    DECLARE @COUNTER INT = 0
    DECLARE @TextPointer VARBINARY(16) 
    DECLARE @DeleteLength INT 
    DECLARE @OffSet INT 

    SELECT @TextPointer = TEXTPTR(CONTENT_TEXT)
      FROM #newtable6

    SET @DeleteLength = LEN(@FindString) 
    SET @OffSet = 0
    SET @FindString = '%' + @FindString + '%'

    WHILE (SELECT COUNT(*)
             FROM #newtable6
            WHERE PATINDEX(@FindString, CONTENT_TEXT) <> 0) > 0
    BEGIN 
        SELECT @OffSet = PATINDEX(@FindString, CONTENT_TEXT) - 1
          FROM #newtable6
         WHERE PATINDEX(@FindString, CONTENT_TEXT) <> 0

UPDATETEXT #newtable6.CONTENT_TEXT
            @TextPointer
            @OffSet
            @DeleteLength
            @ReplaceString

           SET @COUNTER = @COUNTER + 1
    END
    select @COUNTER,* from #newtable6
drop table #newtable6
    SET NOCOUNT OFF

エラーが発生します:

メッセージ7116、レベル16、状態4、プロシージャSearchAndReplace、行31
オフセット1900は、使用可能なLOBデータの範囲内にありません。
ステートメントは終了されました。

ありがとうございました

4

2 に答える 2

5

列タイプを永続的に変更できない場合は、その場でキャストできます。

ALTER PROC [dbo].[SearchAndReplace] 
(@FindString    VARCHAR(100),
 @ReplaceString VARCHAR(100) )
AS
BEGIN
   UPDATE dbo.HTML_CONTENTS
   SET CONTENT_TEXT = cast (REPLACE(cast (CONTEXT_TEXT as varchar(max)), @FindString, @ReplaceString) as TEXT)
END
于 2010-12-30T12:43:58.033 に答える
3

データ型TEXT非推奨であり、今後は使用しないでください。これは、データ型が不格好で、通常の文字列操作メソッドをすべてサポートしていないためです。

text、ntext、imageに関するMSDNドキュメントから:

ntext、text、およびimageデータ型は、MicrosoftSQLServerの将来のバージョンで削除される予定です。これらのデータ型を新しい開発作業で使用することは避け、現在それらを使用しているアプリケーションを変更することを計画してください。代わりに、nvarchar(max)、varchar(max)、およびvarbinary(max)を使用してください。

私の推奨事項:その列をVARCHAR(MAX)に変換すると、その後は問題ないはずです。

ALTER TABLE dbo.HTML_CONTENTS 
   ALTER COLUMN CONTEXT_TEXT VARCHAR(MAX)

それはそれをする必要があります。

列がVARCHAR(MAX)の場合、ストアドプロシージャは完全に単純になります。

ALTER PROC [dbo].[SearchAndReplace] 
(@FindString    VARCHAR(100),
 @ReplaceString VARCHAR(100) )
AS
BEGIN
   UPDATE dbo.HTML_CONTENTS
   SET CONTENT_TEXT = REPLACE(CONTEXT_TEXT, @FindString, @ReplaceString)
END

側面の2つの観察:

  • テーブル全体を更新しないようにするために、ストアドプロシージャに句を含めると便利WHEREです(それが本当に必要な場合を除く)。

  • テーブルで使用TEXTしていますが、ストアドプロシージャのパラメータは次のタイプです。1つのセットNVARCHARに固執するか、通常のパラメータを使用するか、すべてのUnicode文字列を使用してください。これらの非Unicode文字列とUnicode文字列を絶えず混合することは混乱であり、多くの変換と不要なオーバーヘッドを引き起こしますTEXT/VARCHAR(MAX)VARCHAR(100)NTEXT/NVARCHAR(MAX)NVARCHAR(100)

于 2010-12-30T12:24:02.943 に答える