Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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 для текстового типа данных

Ответ 2

Вот пример запроса для обновления таблицы с текстовым столбцом с использованием функции REPLACE. Надеюсь, это полезно для вас.

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

Ответ 3

Это мой фрагмент кода для этого сценария:

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

Вам нужно будет приложить текстовое поле к varchar (8000) или nvarchar (4000), если вы заменяете поле ntext.

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

Это, конечно же, будет работать только в том случае, если вы можете гарантировать, что содержание в поле имеет длину & ​​lt; = 4000/8000 символов.

Ответ 5

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

Например:

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

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

MyVarchar100 = SUBSTRING(myTextField, 1, 100)