none
Update Tabelle eines nvarchar(max)-Feldes mit Zeilenschaltung und Sortierung RRS feed

  • Frage

  • Leider bekomme ich das Update eines nvarchar(max)-Feldes nicht hin:

    CREATE TABLE         [w_staffeltext_temp]
                ([artikel_GUID]        uniqueidentifier    null
                ,[Kurztext]               nvarchar(100)       null
                ,Bezeichnung           nvarchar(200)
                );
    GO

    INSERT INTO         [w_staffeltext_temp]
    VALUES            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'PBS',        'PBS    1 =   61,72'),
                            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'SCH',        'SCH    1 =  103,79'),
                            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'IMC',        'IMC    1 =   66,50'),
                            ('7DAF967F-44F3-477A-B8FE-0001A1864FD8',    'SUP',        'SUP    1 =   19,87'),
                            ('A838FE00-9FE3-4866-8EFC-00025035E42A',    'SC',          ' SC    1 =    2,22'),
                            ('A838FE00-9FE3-4866-8EFC-00025035E42A',    'ADV',        'ADV    1 =   20,20  |   2 =   17,60  |   4 =   17,47)

    ;

    GO

    CREATE TABLE         [w_staffeltext]
                                  ([artikel_GUID]                     uniqueidentifier    null
                                  ,[Fertigungsbezeichnung]    nvarchar(max)
                                  );
    GO

    INSERT INTO         [w_staffeltext]
    VALUES                 ('A5A1B3B0-BF08-422F-A3A9-000158829741'),
                                 ('7DAF967F-44F3-477A-B8FE-0001A1864FD8'),
                                 ('A838FE00-9FE3-4866-8EFC-00025035E42A');
    GO



    Ergebnis soll in Tabelle w_staffeltext so aussehen:
    ===================================================
    [artikel_GUID]                [Fertigungsbezeichnung]    

    A5A1B3B0-BF08-422F-A3A9-000158829741    IMC    1 =   66,50
                                                                             PBS    1 =   61,72
                                                                             SCH    1 =  103,79

    7DAF967F-44F3-477A-B8FE-0001A1864FD8    SUP    1 =   19,87

    A838FE00-9FE3-4866-8EFC-00025035E42A    ADV    1 =   20,20  |   2 =   17,60  |   4 =   17,47
                                                                              SC    1 =    2,22


    Folgender Script funktioniert nicht:
    ====================================
    UPDATE        w_staffeltext
    SET               Bezeichnung     =    b.Fertigungsbezeichnung + CHAR(13) + CHAR(10)

    FROM            w_staffeltext_temp as a Join wilke.dbo.w_staffeltext as b
    ON                a.artikel_GUID     = b.artikel_GUID
    ORDER BY     a.Kurztext    
    ;
    GO

    Kann mir da jemand helfen, ich stehe total auf dem Schlauch...

    Vielen Dank.

    Dienstag, 15. Mai 2018 11:55

Antworten

  • Ja, da war noch eine Feldlänge zu klein, und die Kommas im Quelltext hatte ich auch nicht bedacht!

    With Kommaseparierte_Liste as
    (
    SELECT artikel_GUID, LEFT(MyCommaSeparatedList
           , LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList
      FROM w_staffeltext c 
      CROSS APPLY
      (SELECT CAST(Bezeichnung AS NVARCHAR(200)) + CHAR(131)
        FROM w_staffeltext_temp o
       WHERE o.artikel_GUID = c.artikel_GUID
       ORDER BY o.Bezeichnung
         FOR XML PATH('')) AS x(MyCommaSeparatedList)
    )
    Update b 
    Set Fertigungsbezeichnung = replace(k.MyCommaSeparatedList, CHAR(131), CHAR(13)+CHAR(10))
    from w_staffeltext b
    Inner Join Kommaseparierte_Liste k
    	on b.artikel_GUID = k.artikel_GUID
    ;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 16. Mai 2018 08:52

Alle Antworten

  • Folgender Script funktioniert nicht:
    ====================================
    UPDATE        w_staffeltext
    SET               Bezeichnung     =    b.Fertigungsbezeichnung + CHAR(13) + CHAR(10)

    FROM            w_staffeltext_temp as a Join wilke.dbo.w_staffeltext as b
    ON                a.artikel_GUID     = b.artikel_GUID
    ORDER BY     a.Kurztext    

    Hallo,

    was heisst konkret funktioniert nicht? Das ORDER BY ist bei einem UPDATE nicht zulässig und wird schon mal einen Fehler geben => entfernen. Wozu soll das CR+LF am Ende der Daten den gut sein?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 15. Mai 2018 12:28
  • Hallo,

    ich habe "Order by" entfernt, es funktioniert nicht, dass in das Feld "Fertigungsbezeichnung nvarchar(max)" die Strings untereinander geschrieben werden.

    Ich möchte erreichen, dass in der Tabelle "w_staffeltext" nur ein Datensatz für das Feld "artikel_GUID" und alle dazugehörigen Werte in das Feld "Fertigungsbezeichnung" untereinander und nach dem Feld "Kurztext" sortiert geschrieben werden.

    Gibt es dafür eine Lösung?

    Vielen Dank.

    Mittwoch, 16. Mai 2018 05:42
  • Das ist im Prinzip der Aufbau einer kommaseparierten Liste!

    CREATE TABLE         [w_staffeltext_temp]
                ([artikel_GUID]        uniqueidentifier    null
                ,[Kurztext]               nvarchar(100)       null
                ,Bezeichnung           nvarchar(200)
                );
    GO
    
    INSERT INTO         [w_staffeltext_temp]
    VALUES            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'PBS',        'PBS    1 =   61,72'),
                            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'SCH',        'SCH    1 =  103,79'),
                            ('A5A1B3B0-BF08-422F-A3A9-000158829741',    'IMC',        'IMC    1 =   66,50'),
                            ('7DAF967F-44F3-477A-B8FE-0001A1864FD8',    'SUP',        'SUP    1 =   19,87'),
                            ('A838FE00-9FE3-4866-8EFC-00025035E42A',    'SC',          ' SC    1 =    2,22'),
                            ('A838FE00-9FE3-4866-8EFC-00025035E42A',    'ADV',        'ADV    1 =   20,20  |   2 =   17,60  |   4 =   17,47')
    
    ;
    
    GO
    
    CREATE TABLE         [w_staffeltext]
                                  ([artikel_GUID]                     uniqueidentifier    null
                                  ,[Fertigungsbezeichnung]    nvarchar(max)
                                  );
    GO
    
    INSERT INTO         [w_staffeltext] (artikel_GUID)
    VALUES                 ('A5A1B3B0-BF08-422F-A3A9-000158829741'),
                                 ('7DAF967F-44F3-477A-B8FE-0001A1864FD8'),
                                 ('A838FE00-9FE3-4866-8EFC-00025035E42A');
    GO
    
    Select *
    from w_staffeltext;
    
    With Kommaseparierte_Liste as
    (
    SELECT artikel_GUID, LEFT(MyCommaSeparatedList
           , LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList
      FROM w_staffeltext c 
      CROSS APPLY
      (SELECT CAST(Bezeichnung AS NVARCHAR(10)) + ','
        FROM w_staffeltext_temp o
       WHERE o.artikel_GUID = c.artikel_GUID
       ORDER BY o.Bezeichnung
         FOR XML PATH('')) AS x(MyCommaSeparatedList)
    )
    Update b 
    Set Fertigungsbezeichnung = replace(k.MyCommaSeparatedList, ',', CHAR(13)+CHAR(10))
    from w_staffeltext b
    Inner Join Kommaseparierte_Liste k
    	on b.artikel_GUID = k.artikel_GUID
    ;
    
    Select *
    from w_staffeltext;

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 16. Mai 2018 06:03
  • Erst mal vielen Dank für Deine Antwort.

    Leider funktioniert das nicht so richtig. Mit dem Code kommt follgendes Ergenis:

    artikel_GUID                                                    Fertigungsbezeichnung

    A5A1B3B0-BF08-422F-A3A9-000158829741    IMC    1

                                                                             PBS    1

                                                                             SCH    1

    A838FE00-9FE3-4866-8EFC-00025035E42A       SC

                                                                             ADV     1

    7DAF967F-44F3-477A-B8FE-0001A1864FD8     SUP     1

    Es Ergebnis möchte ich gerne die gesamte Länge des Felde "Bezeichnung" und die Sortiert nach dem Feld  "Kurztext":

    A5A1B3B0-BF08-422F-A3A9-000158829741    IMC    1 =   66,50

                                                                             PBS    1 =   61,72

                                                                             SCH    1 =  103,79

    A838FE00-9FE3-4866-8EFC-00025035E42A     ADV    1 =   20,20  |     2 =   17,60   |     4 =   17,47

                                                                               SC     1 =    2,22

    17DAF967F-44F3-477A-B8FE-0001A1864FD8    SUP    1 =   19,87

    Ist das möglich?

    Vielen Dank.

    Mittwoch, 16. Mai 2018 08:43
  • Ja, da war noch eine Feldlänge zu klein, und die Kommas im Quelltext hatte ich auch nicht bedacht!

    With Kommaseparierte_Liste as
    (
    SELECT artikel_GUID, LEFT(MyCommaSeparatedList
           , LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList
      FROM w_staffeltext c 
      CROSS APPLY
      (SELECT CAST(Bezeichnung AS NVARCHAR(200)) + CHAR(131)
        FROM w_staffeltext_temp o
       WHERE o.artikel_GUID = c.artikel_GUID
       ORDER BY o.Bezeichnung
         FOR XML PATH('')) AS x(MyCommaSeparatedList)
    )
    Update b 
    Set Fertigungsbezeichnung = replace(k.MyCommaSeparatedList, CHAR(131), CHAR(13)+CHAR(10))
    from w_staffeltext b
    Inner Join Kommaseparierte_Liste k
    	on b.artikel_GUID = k.artikel_GUID
    ;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 16. Mai 2018 08:52
  • Vielen Dank. Leider wird jetzt das Steuerzeichen "&#x0D" im Feld "Fertungsbezeichnung" angezeigt ist es noch nicht das benötigte Ergebnis:

    artikel_GUID                                                            Fertigungsbezeichnung

    A838FE00-9FE3-4866-8EFC-00025035E42A           ADV    1 =   20,20  |   2 =   17,60  |   4 =   17,47
                                                                  

    SC    1 =    2,22

    A5A1B3B0-BF08-422F-A3A9-000158829741            IMC    1 =   61,72

                                                                                     PBS    1 =  103,79
  

                                                                                     SCH    1 =   66,50

    7DAF967F-44F3-477A-B8FE-0001A1864FD8             SUP    1 =   19,87

    Kann man das Feld "Fertigungsbezeichnung" ohne "&#x0D" bekommen?

    Vielen Dank.

    Mittwoch, 16. Mai 2018 09:22
  • Sorry, war mein Fehler.

    Dein Script läuft super und ich bedanke mich bei Deiner Kompetenz und Engamement.

    Vielen, vielen Dank.

    Mittwoch, 16. Mai 2018 09:47
  • Also im SSMS wird es bei mir nicht angezeigt.

    
 ist das CHAR(13). Dann würde ich oben nur ein CHAR(10) einfügen.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 16. Mai 2018 09:50
  • Alles super, läuft prima.

    Vielen Dank für die Hilfe

    Donnerstag, 17. Mai 2018 12:10
  • Prima!

    Es wäre schön, wenn Du dann noch meine Antwort als die richtige Antwort markieren würdest, denn die wird später mal als erstes angezeigt. 

    Die Kennzeichnung bei Deiner letzten Antwort könntest Du dann wieder entfernen.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 17. Mai 2018 12:37