Frage

Ich bin gerade dabei, eine temporäre Prozedur in SQL zu erstellen, weil ich einen Wert einer Tabelle habe, der in Markdown geschrieben ist, sodass er im Webbrowser als gerenderter HTML-Code angezeigt wird (Abschlag zur HTML-Konvertierung).

Die Zeichenfolge der Spalte sieht derzeit so aus:

Questions about **general computing hardware and software** are off-topic for Stack Overflow unless they directly involve tools used primarily for programming. You may be able to get help on [Super User](http://superuser.com/about)

Ich arbeite derzeit mit fettem und kursivem Text.Diese Durchschnitts (bei fettem Text) Ich muss das ungerade N-fache des Musters ersetzen**mit<b>und sogar mal mit</b>.
ich sah ersetzen() aber es führt die Ersetzung für alle Muster der Zeichenfolge durch.

Wie kann ich also eine Teilzeichenfolge nur ersetzen, wenn sie ungerade oder nur gerade ist?

Aktualisieren: Manche Leute fragen sich, welche Schemata ich verwende, also werfen Sie einfach einen Blick darauf Hier.

Noch ein Extra, wenn Sie möchten: Der Hyperlink im Markdown-Stil zum HTML-Hyperlink sieht nicht so einfach aus.

War es hilfreich?

Lösung

Verwendung derSTUFFFunktion und eine einfacheWHILESchleife:

CREATE FUNCTION dbo.fn_OddEvenReplace(@text nvarchar(500), 
                                      @textToReplace nvarchar(10), 
                                      @oddText nvarchar(10), 
                                      @evenText nvarchar(500))
RETURNS varchar(max)
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    RETURN @text
END

Und Sie können es so verwenden:

SELECT dbo.fn_OddEvenReplace(column, '**', '<b>', '</b>')
FROM table

AKTUALISIEREN:

Dies wird als SP umgeschrieben:

CREATE PROC dbo.##sp_OddEvenReplace @text nvarchar(500), 
                                  @textToReplace nvarchar(10), 
                                  @oddText nvarchar(10), 
                                  @evenText nvarchar(10),
                                  @returnText nvarchar(500) output
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    SET @returnText = @text
END
GO

Und zur Ausführung:

DECLARE @returnText nvarchar(500)
EXEC dbo.##sp_OddEvenReplace '**a** **b** **c**', '**', '<b>', '</b>', @returnText output

SELECT @returnText

Andere Tipps

Gemäß der Anfrage des OPs habe ich meine frühere Antwort geändert, um als temporäre gespeicherte Prozedur auszuführen.Ich habe meine frühere Antwort verlassen, da ich der Anwender der Nutzung gegen einen Tisch von Saiten glaube, auch nützlich zu sein.

Wenn bekannt ist, dass eine Tally- (oder Nummern) bereits mit mindestens 8000 Werten vorhanden ist, kann der markierte Abschnitt des CTE weggelassen werden und die CTE-Referenz tally durch den Namen derBestehender Tally-Tisch.

generasacodicetagpre.

hat so aufgerufen:

generasacodicetagpre.

es ergibt als Ausgabe:

generasacodicetagpre.

Eine Möglichkeit besteht darin, einen regulären Ausdruck zu verwenden, da dieser das Ersetzen solcher Muster sehr einfach macht.RegEx-Funktionen sind nicht in SQL Server integriert, daher müssen Sie SQL CLR verwenden, entweder von Ihnen kompiliert oder aus einer vorhandenen Bibliothek.

Für dieses Beispiel verwende ich die SQL# (SQLsharp) Bibliothek (deren Autor ich bin), aber die RegEx-Funktionen sind in der kostenlosen Version verfügbar.

SELECT SQL#.RegEx_Replace
(
   N'Questions about **general computing hardware and software** are off-topic\
for Stack Overflow unless **they** directly involve tools used primarily for\
**programming. You may be able to get help on [Super User]\
(https://superuser.com/about)', -- @ExpressionToValidate
   N'\*\*([^\*]*)\*\*', -- @RegularExpression
   N'<b>$1</b>', -- @Replacement
   -1, -- @Count (-1 = all)
   1, - @StartAt
   'IgnoreCase' -- @RegEx options
);

Das obige Muster \*\*([^\*]*)\*\* sucht einfach nach allem, was von doppelten Sternchen umgeben ist.In diesem Fall müssen Sie sich keine Gedanken über gerade/ungerade machen.Es bedeutet auch, dass Sie keine schlecht geformte Figur bekommen <b>-only-Tag, wenn es aus irgendeinem Grund ein Extra gibt ** in der Zeichenfolge.Ich habe der ursprünglichen Zeichenfolge zwei zusätzliche Testfälle hinzugefügt:ein kompletter Satz von ** um das Wort herum they und ein unübertroffenes Set von ** kurz vor dem Wort programming.Die Ausgabe ist:

Questions about <b>general computing hardware and software</b> are off-topicfor Stack Overflow unless <b>they</b> directly involve tools used primarily for **programming. You may be able to get help on [Super User](https://superuser.com/about)

was wie folgt wiedergegeben wird:

Fragen über allgemeine Computerhardware und -software sind für Stack Overflow nicht zum Thema, es sei denn Sie beziehen sich direkt auf Werkzeuge, die hauptsächlich für die Programmierung verwendet werden.Möglicherweise können Sie Hilfe erhalten Superuser

Diese Lösung nutzt die von Jeff Moden beschriebenen Techniken in diesen Artikel über die laufende SummeProblem in SQL .Diese Lösung ist langwierig, aber durch Verwendung des -Quirk-Updates in SQL Server über einen gruppierten Index, ist das Versprechen, wesentlich effizienter über große Datensätze als cursor-basierte Lösungen zu erhalten.

update - geändert, um eine Tabelle von Saiten zu betreiben

Angenommen, das Vorhandensein einer solchen Tally-Tabelle (mit mindestens 8000 Reihen):

generasacodicetagpre.

und ein htmltagspotter funktionsfunktion solche definiert:

generasacodicetagpre.

Durchführen der folgenden SQL führt die erforderliche Substitution aus.Beachten Sie, dass der innere Join am Ende alle nachlaufenden "ungeraden" Tags verhindert, dass sie konvertiert werden:

generasacodicetagpre.

nachgeben:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top