Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 replace один раз  [new]
zebn
Member

Откуда:
Сообщений: 8
Здравствуйте, есть база книг с описаниями, нужно в описаниях заменить определенные слова на другие.

Как заставить оператор replace заменять не все слова в строке-аргументе, а только первое

WHILE @@FETCH_STATUS = 0
 BEGIN

 SET @vpredIdbook = @vIdbook;
  FETCH NEXT FROM @rCursor INTO @vIdbook;
  update offer set description = replace(CAST(description as NVarchar(MAX)),'% '+@vSlovo+'[ ,.;]%', @str1+CHAR(46)+@str2+@vpredIdbook+@str3+@vSlovo+@str4) where id=@vIdbook;
 END
 CLOSE @rCursor;


Например сейчас у меня: "Физика 10-11класс. Физика - царица наук. Научитесь физике с нами" заменяется на "Математика 10-11класс. Математика - царица наук. Научитесь математике с нами"

А нужно: "Физика 10-11класс. Физика - царица наук. Научитесь физике с нами" заменяется на "Математика 10-11класс. Физика - царица наук. Научитесь физике с нами"
28 ноя 12, 13:16    [13542236]     Ответить | Цитировать Сообщить модератору
 Re: replace один раз  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
charindex + stuff
28 ноя 12, 13:24    [13542321]     Ответить | Цитировать Сообщить модератору
 Re: replace один раз  [new]
AnaceH
Member

Откуда:
Сообщений: 109
zebn,

declare @s nvarchar(1111) = 'asdasdAAAsdfsdfAAAffasfAAAasdasd'
declare @pattern nvarchar(1111) = 'AAA'
declare @index int = PATINDEX('%'+@pattern+'%', @s)  + len(@pattern) - 1
select stuff(@s ,1 , @index, replace(left(@s, @index), @pattern, 'BBB'))


Зачем тут курсор, кстати? Он определенно не нужен. Как использовать "предыдущее" значение - поищите по форуму, примеров масса.
28 ноя 12, 13:43    [13542521]     Ответить | Цитировать Сообщить модератору
 Re: replace один раз  [new]
zebn
Member

Откуда:
Сообщений: 8
Спасибо, попробую, курсор у меня для перелинковки книг, те предыдущая ссылается на следующую, и так каждый раз по всей таблице для каждого ключевого слова. Я просто выдернул кусок из своего кода.
28 ноя 12, 18:43    [13545342]     Ответить | Цитировать Сообщить модератору
 Re: replace один раз  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
AnaceH
declare @s nvarchar(1111) = 'asdasdAAAsdfsdfAAAffasfAAAasdasd'
declare @pattern nvarchar(1111) = 'AAA'
declare @index int = PATINDEX('%'+@pattern+'%', @s)  + len(@pattern) - 1
select stuff(@s ,1 , @index, replace(left(@s, @index), @pattern, 'BBB'))

IMHO вместо len(@pattern) нужно datalength(@pattern)
28 ноя 12, 18:47    [13545361]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить