T-sql заменить на текстовое поле

Я столкнулся с классической проблемой необходимости замены строки в текстовом поле в базе данных sql 2000. Это может быть либо обновление по всему столбцу, либо одно поле, которое я не суетлив.

Я нашел несколько примеров того, как использовать updatetext для его достижения, но они, как правило, находятся в хранимых процедурах, кто-нибудь знает о подобной вещи, которая завернута в функцию, поэтому я могу использовать ее так, как обычно использую Replace(). Проблема с функцией Replace () для любого кто не знает, что он не поддерживает текстовые поля.

Edit: я понял, что, вероятно, смогу уйти с varchar(8000), поэтому поменял поля на этот тип, который устраняет проблему. Я так и не нашел верного решения.

5 ответов


боюсь, вы не можете сделать это в пределах функции

когда вы пытаетесь объявить функцию как:

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(8000) или nvarchar (4000), если вы заменяете текстовое поле.

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

этот курс будет работать только в том случае, если вы можете гарантировать, что содержимое в поле имеет длину


вы также можете использовать функцию SUBSTRING (), которая возвращает varchar при передаче текстового значения.

например:

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

Если вы заполняете varchar с определенной длиной, вы можете усечь, чтобы соответствовать:

MyVarchar100 = SUBSTRING(myTextField, 1, 100)