none
Mehrwertige Spalte in Zeilen aufteilen RRS feed

  • Frage

  • Hallo,

    ich möchte folgendes machen: eine Spalte in einer Tabelle enthält mehrere Werte, die durch '|' getrennt sind. Ich würde jetzt gerne diese Werte in eine zweite Tabelle aber dann als einzelne Zeilen übertragen.

    Wie mache ich das?

    Danke für eure Hilfe, Volker

    Montag, 29. August 2011 11:41

Antworten

  • Hallo Volker,

     

     

    SELECT DeineTabelle.KrummerWert,
     r.*
    FROM dbo.DeineTabelle CROSS APPLY dbo.fnSplit(DeineTabelle.KrummerWert, '|') r

     


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITS Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    Montag, 29. August 2011 13:49

Alle Antworten

  • Hallo,

    Volker Hofheinz wrote:

    ich möchte folgendes machen: eine Spalte in einer Tabelle enthält mehrere
    Werte, die durch '|' getrennt sind. Ich würde jetzt gerne diese Werte in
    eine zweite Tabelle aber dann als einzelne Zeilen übertragen.

    Wie mache ich das?

    Ich hab mir vor laengerer Zeit mal ein TSQL-Pendant zur VBA-Funktion
    Split() geschrieben.
    Neue Table-valued Function:

    CREATE FUNCTION [dbo].[fnSplit]
    (
      @InputString AS NVARCHAR(MAX),
      @Separator AS NVARCHAR(1)
    )
    RETURNS
    @MyTempTable TABLE
    (
     StringPart NVARCHAR(MAX)
    )
    AS
    BEGIN
     DECLARE @I AS INT
      DECLARE @T AS NVARCHAR(MAX)
      DECLARE @S AS NVARCHAR(MAX)
      SET @S = @InputString
      SET @I = CHARINDEX(@Separator, @S)
      WHILE @I > 0
        BEGIN
          SET @T = LEFT(@S, @I-1)
          SET @S = RIGHT(@S, LEN(@S) - @I)
          IF @T <> ''
            INSERT INTO @MyTempTable(StringPart) VALUES (@T)
          SET @I = CHARINDEX(@Separator, @S)
        END
      IF COALESCE(@S, '') <> ''
        INSERT INTO @MyTempTable(StringPart) VALUES (@S)
     RETURN
    END

    Aufruf:

    SELECT * FROM dbo.fnSplit('A1|B2|C3|D', '|')

    Gruss - Peter


    Peter Doering [MVP Access]

    • Als Antwort vorgeschlagen Uwe RickenMVP Montag, 29. August 2011 14:02
    Montag, 29. August 2011 11:59
  • Hallo Peter,

    danke für die Funktion, allerdings erhalte ich beim Aufruf einen Fehler:

    Aufruf: select

    dbo.fnSplit(kotr_name, '|') as name from z_kotr

    Fehler:

    Die dbo-Spalte oder die benutzerdefinierte Funktion bzw. das benutzerdefinierte Aggregat 'dbo.fnSplit' wurde nicht gefunden, oder der Name ist mehrdeutig.

    Woe liegt das Problem?

    Danke, Volker

    Montag, 29. August 2011 13:10
  • Hallo Volker,

    wie Peter schon gezeigt hat, werden Tabellenwertfunktionen mit SELECT angesprochen:

    SELECT * FROM dbo.fnSplit('A1|B2|C3|D', '|')

    Gruß Elmar

    Montag, 29. August 2011 13:37
    Beantworter
  • Hallo,

    und wie wende ich die Funktion nun auf meine Tabelle an? Das war meine Frage. Der angegebene Select funktioniert ja nur mit den eingegebenen Werten, diese habe ich aber in einer Tabellenspalte stehen und möchte diese nun in eine zweite Tabelle "übertragen".

    Gruß und Danke, Volker

    Montag, 29. August 2011 13:45
  • Hallo Volker,

     

     

    SELECT DeineTabelle.KrummerWert,
     r.*
    FROM dbo.DeineTabelle CROSS APPLY dbo.fnSplit(DeineTabelle.KrummerWert, '|') r

     


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITS Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    Montag, 29. August 2011 13:49
  • Super, Danke.
    Montag, 29. August 2011 13:56