2013-01-09 5 views
6

Ich habe eine lange NVARCHAR Variable, wo ich brauche einige Muster wie folgt zu ersetzen: aussehen wieWie kann ich ein REPLACE PATTERN in SQL erstellen?</p> <pre><code>'Hello stackoverflow world' </code></pre> <p>Wie kann ich tun:

DECLARE @data NVARCHAR(200) = 'Hello [PAT1] stackoverflow [PAT2] world [PAT3]' 

ich alle [PAT%] mit einem Leerzeichen ersetzen müssen dies mit T-SQL in SQL Server 2008?

Ich suchte in anderen Fragen, und ich fand nur this, aber es hilft mir nicht, weil ich nicht den ursprünglichen Teil der Zeichenfolge beibehalten müssen.

Antwort

10

Sie können diese Funktion für Muster ersetzen verwenden. Sie können es mit diesem SQL-Fiddle demo testen testen.

CREATE FUNCTION dbo.PatternReplace 
(
    @InputString VARCHAR(4000), 
    @Pattern VARCHAR(100), 
    @ReplaceText VARCHAR(4000) 
) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 
    DECLARE @Result VARCHAR(4000) SET @Result = '' 
    -- First character in a match 
    DECLARE @First INT 
    -- Next character to start search on 
    DECLARE @Next INT SET @Next = 1 
    -- Length of the total string -- 8001 if @InputString is NULL 
    DECLARE @Len INT SET @Len = COALESCE(LEN(@InputString), 8001) 
    -- End of a pattern 
    DECLARE @EndPattern INT 

    WHILE (@Next <= @Len) 
    BEGIN 
     SET @First = PATINDEX('%' + @Pattern + '%', SUBSTRING(@InputString, @Next, @Len)) 
     IF COALESCE(@First, 0) = 0 --no match - return 
     BEGIN 
     SET @Result = @Result + 
      CASE --return NULL, just like REPLACE, if inputs are NULL 
       WHEN @InputString IS NULL 
        OR @Pattern IS NULL 
        OR @ReplaceText IS NULL THEN NULL 
       ELSE SUBSTRING(@InputString, @Next, @Len) 
      END 
     BREAK 
     END 
     ELSE 
     BEGIN 
     -- Concatenate characters before the match to the result 
     SET @Result = @Result + SUBSTRING(@InputString, @Next, @First - 1) 
     SET @Next = @Next + @First - 1 

     SET @EndPattern = 1 
     -- Find start of end pattern range 
     WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) = 0 
      SET @EndPattern = @EndPattern + 1 
     -- Find end of pattern range 
     WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) > 0 
       AND @Len >= (@Next + @EndPattern - 1) 
      SET @EndPattern = @EndPattern + 1 

     --Either at the end of the pattern or @Next + @EndPattern = @Len 
     SET @Result = @Result + @ReplaceText 
     SET @Next = @Next + @EndPattern - 1 
     END 
    END 
    RETURN(@Result) 
END 

Resource link.

+0

Vielen Dank !, aus irgendeinem Grund kann ich nicht sehen, wenn ich Klammern verwenden [] es funktioniert nicht, aber ich hatte sie mit Klammern geändert und es funktioniert. Ich kannte SQL Fiddle nicht, ist super!, Danke auch dafür. – Elwi

+1

siehe [diese] (http://www.sqllion.com/2010/12/pattern-matching-regex-in-t-sql/) Erklärung der Klammern! Bitte! – Nico

Verwandte Themen