Ich benutze die Multi-Select-Erweiterung im JobRouter und möchte den Inhalt des gespeicherten JSON-Strings als kommaseparierte Liste in einer Übersicht darstellen.
Ich benutze die Multi-Select-Erweiterung im JobRouter und möchte den Inhalt des gespeicherten JSON-Strings als kommaseparierte Liste in einer Übersicht darstellen.
Angenommen, die fragliche Tabelle sieht so aus:

Die Funktion OPENJSON hilft uns, die JSON-Spalte zu parsen, mit FOR XML PATH gibt man das Ergebnis als XML Struktur zurück:
```
SELECT name, (SELECT * FROM OPENJSON(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Also eine Tabelle, mit den Spalten key, value und type, die in eine XML Struktur umgewandelt wird (die types sind 0: string, 1: number, 2: boolean, 3:null, 4:object, 5:array).
Uns interessiert die Spalte **value**:
```
SELECT name, (SELECT value FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Die value-tags sollten wir noch per CAST umwandeln:
```
SELECT name, (SELECT CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Fehlen noch die Kommata:
```
SELECT name, (SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Muss noch das erste Komma und das erste Leerzeichen weg:
```
SELECT name, SUBSTRING((SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')), 3, 10000) AS Hobbies FROM jsontest j;
```
Bei der SQL Server SUBSTRING Funktion braucht man zwingend sowohl einen Start- als auch einen Endwert, deswegen die 10000.
Ergebnis:

Und das wär's :-)
Angenommen, die fragliche Tabelle sieht so aus:

Die Funktion OPENJSON hilft uns, die JSON-Spalte zu parsen, mit FOR XML PATH gibt das Ergebnis als XML Struktur zurück:
```
SELECT name, (SELECT * FROM OPENJSON(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Also eine Tabelle, mit den Spalten key, value und type, die in eine XML Struktur umgewandelt wird (die types sind 0: string, 1: number, 2: boolean, 3:null, 4:object, 5:array).
Uns interessiert die Spalte **value**:
```
SELECT name, (SELECT value FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Die value-tags sollten wir noch per CAST umwandeln:
```
SELECT name, (SELECT CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Fehlen noch die Kommata:
```
SELECT name, (SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Muss noch das erste Komma und das erste Leerzeichen weg:
```
SELECT name, SUBSTRING((SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')), 3, 10000) AS Hobbies FROM jsontest j;
```
Bei der SQL Server SUBSTRING Funktion braucht man zwingend sowohl einen Start- als auch einen Endwert, deswegen die 10000.
Ergebnis:

Und das wär's :-)
Ich benutze die Multi-Select-Erweiterung im JobRouter und möchte den Inhalt des gespeicherten JSON-Strings als kommaseparierte Liste in einer Übersicht darstellen.
Angenommen, die fragliche Tabelle sieht so aus:

Die Funktion OPENJSON hilft uns, die JSON-Spalte zu parsen, mit FOR XML PATH gibt das Ergebnis als XML Struktur zurück:
```
SELECT name, (SELECT * FROM OPENJSON(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Also eine Tabelle, mit den Spalten key, value und type, die in eine XML Struktur umgewandelt wird (die types sind 0: string, 1: number, 2: boolean, 3:null, 4:object, 5:array).
Uns interessiert die Spalte **value**:
```
SELECT name, (SELECT value FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Die value-tags sollten wir noch per CAST umwandeln:
```
SELECT name, (SELECT CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Fehlen noch die Kommata:
```
SELECT name, (SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')) FROM jsontest j;
```
Ergebnis:

Muss noch das erste Komma und das erste Leerzeichen weg:
```
SELECT name, SUBSTRING((SELECT ', ' + CAST(value AS NVARCHAR) FROM openjson(j.hobbies) FOR XML PATH('')), 3, 10000) AS Hobbies FROM jsontest j;
```
Bei der SQL Server SUBSTRING Funktion braucht man zwingend sowohl einen Start- als auch einen Endwert, deswegen die 10000.
Ergebnis:

Und das wär's :-)