2009-05-13 6 views
4

Benutzer SQLServer 2005 Hier ist ein Beispiel für Zeichenfolge, mit der ich festhalte: {\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang1033 {\ fonttbl {\ f0 \ fnil \ fcharset0 Arial abgerundet MT fett ;} {\ f1 \ fnil \ fcharset0 Arial;}} \ viewkind4 \ uc1 \ pard \ f0 \ fs54 1000 \ fs20 \ par f1 \}Mehrere Instanzen in SELECT-Anweisung ersetzen

I

jeden Schriftnamen mit 'Times New Roman' ersetzt werden soll

ich kann den ersten mit (textlong1 ist das Feld) erhalten:

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 

ich den Fall ERKLÄRU bin mit nt, um den SubString vor einem Fehler zu schützen.

Da ich 'fcharset' nicht ersetze, selbst wenn ich durchschlinge, findet es nicht die zweite Instanz (bleibt immer auf der ersten stecken).

Antwort

1

Wenn Sie die erste ersetzen können, ersetzen Sie einfach, bis es keine erste gibt. Wenn Sie ein Update tun:

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

Oder in eine neue Variable Auswahl:

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 

Das Endergebnis nun in @cur gespeichert (. Und @Next auch)

+0

Da ich 'fcharset' nicht ersetze, kann ich die Ersetzung nicht dazu bringen, die erste korrigierte zu überspringen (Siehe Bearbeitung, die ich gemacht habe.). – JeffO

+0

Ersetze alle "fcharset0 Times New Roman" mit "fcharset0 Arial Rounded MT Bold", bevor du beginnst. Bei jeder Schleifeniteration starten Sie die Suche mit Index 1 oder nach dem ersten Auftreten von "fcharset0 Times New Roman". – Andomar

+0

Danke für die Hilfe. Ich habe die folgende declare @Start int --included dies in allen CHARINDEX Funktionen als Start --last Linie While-Schleife: SET @Start = Charindex (';', @ nächsten, @Start) – JeffO

0

Sie könnten immer eine Trennzeichenprozedur verwenden, um die Zeichenfolge um die Instanzen Ihrer Liste von Zeichensätzen zu brechen und sie durch mal new roman zu ersetzen.

+0

Hast du Mittelwertbegrenzer? Versuche, eine Suche durchzuführen. – JeffO

+0

Ja, das ist, was ich meine – DForck42

2

Wenn Sie die .NET CLR-Funktionalität integrieren können (MSDN hat viele Beispiele dafür), könnten Sie eine regex-Ersetzung verwenden und Ihre Aufgabe sehr einfach gestalten.

+0

Es ist eine Anwendung von Drittanbietern mit dieser Datenbank (Wenn ich mehr Kontrolle über das Front-End hätte, würde ich diesen Unsinn nicht zulassen.). Ich muss sehen, ob das ein Problem verursacht. – JeffO

+0

Ja, ich weiß, .NET CLR-Integration ist nicht immer praktisch (egal wie viel MSDN es schiebt ;-), deshalb habe ich gesagt "Wenn du kannst". Wenn Sie das nicht können, sind nur die Workarounds, die Sie in anderen Antworten vorgeschlagen haben. –

+0

Das einzige wirkliche Problem ist, dass von dem, was ich ineffiziente Verwendung von CLR gehört, erstellt einen extrem hohen Overhead. – DForck42