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)