在select语句中替换多个实例

时间:2009-05-13 21:12:18

标签: sql sql-server replace

用户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 个答案:

答案 0 :(得分:2)

如果您可以集成.NET CLR功能(MSDN有很多示例),您可以使用正则表达式替换并使您的任务变得非常简单。

答案 1 :(得分:1)

如果你可以更换第一个,只需继续更换,直到没有第一个。如果您正在进行更新:

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中)。

答案 2 :(得分:0)

您总是可以使用分隔符程序来破坏字体列表实例周围的字符串,并用新罗马字符替换它们。