Заменить несколько экземпляров в операторе выбора - PullRequest
4 голосов
/ 14 мая 2009

Пользователь SQLServer 2005 Вот пример строки, с которой я застрял: {\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang1033 {\ fonttbl {\ f0 \ fnil \ fcharset0 Arial Rounded MT Bold;} {\ f1 \ fnil \ fcharset0 Arial;}} \ viewkind4 \ uc1 \ pard \ f0 \ fs54 1000 \ f1 \ fs20 \ par}

Я хочу заменить любое имя шрифта на «Times New Roman»

Я могу получить первый с (textlong1 это поле):

 Select Replace(textlong1, 
        CASE When CharIndex(';',textlong1)> 10 Then
        SubString(textlong1
        , Charindex('fcharset',textlong1)+10
        , CharIndex(';',textlong1) - Charindex('fcharset',textlong1)-10) 
        Else '' End
        , 'Times New Roman') From exampletable

Я использую оператор case для предотвращения ошибки в SubString.

Поскольку я не заменяю 'fcharset', даже если я перебираю цикл, он не находит второй экземпляр (всегда застревает на первом).

Ответы [ 3 ]

2 голосов
/ 14 мая 2009

Если вы можете интегрировать функциональность .NET CLR (для этого есть много примеров в MSDN), вы можете использовать замену регулярных выражений и упростить задачу.

1 голос
/ 14 мая 2009

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

declare @done bit
while @done <> 1
    begin
    UPDATE ...
    if @@rowcount = 0 set done = 1
    end

Или выбор новой переменной:

declare @cur varchar(4000)
declare @next varchar(4000)
set @cur = 'The string to operate on'
set @next = ''
while @cur <> @next
    begin
    set @next = @cur
    select @cur = REPLACE(@next,...)
    end

Окончательный результат теперь сохраняется в @cur (и @next тоже.)

0 голосов
/ 14 мая 2009

Вы всегда можете использовать процедуру разделителя, чтобы разбить строку вокруг экземпляров вашего списка шрифтов и заменить их на новые римские.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...