т-sql заменить на текстовое поле - PullRequest
29 голосов
/ 14 ноября 2008

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

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

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

Ответы [ 5 ]

48 голосов
/ 26 октября 2009

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

UPDATE <Table> set textcolumn=
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition>
4 голосов
/ 20 ноября 2008

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

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
3 голосов
/ 14 ноября 2008

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

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

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

1 голос
/ 13 августа 2009

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

Например:

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

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

MyVarchar100 = SUBSTRING(myTextField, 1, 100)
1 голос
/ 16 февраля 2009

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

MyField = ЗАМЕНА (CAST (MyField как VARCHAR (4000)), "string1", "string2")

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

...