T-sql заменить на текстовое поле
Я столкнулся с классической проблемой, связанной с необходимостью замены строки в текстовом поле в базе данных sql 2000. Это может быть либо обновление по целому столбцу, либо одно поле. Я не суетливый.
Я нашел несколько примеров того, как использовать updatetext для его достижения, но они, как правило, хранятся в хранимых процедурах, кто-нибудь знает о подобной вещи, которая обернута в функцию, поэтому я могу использовать ее, как обычно я бы использовал Replace(). Проблема с функцией Replace() для тех, кто не знает, что это не поддерживает текстовые поля.
Изменить: я понял, что я мог бы уйти с varchar (8000), поэтому поменял поля на этот тип, который устраняет проблему. Я никогда не нашел истинного решения.
Ответы
Ответ 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)