2017-01-04 1 views
0

Ich habe eine Spalte Item(varchar(max)) in meinem SQL Server mit dem Namen es Zellendaten wie folgt enthält:Erstellen Sie mehrere Zeilen aus Zellenwert

'1 | 2 | 3 | 4 | 5'

I wollen ausgeben als:

1 
2 
3 
4 
5 

Ist es möglich, dies mit SQL Server Management Studio zu tun.

+1

Ja. Hier ist eine gute Referenz für eine Reihe von Möglichkeiten, Strings zu splitten: https://sqlperformance.com/2012/07/t-sql-queries/split-strings – ZLK

+1

Die beste Lösung wäre, aufzuhören, begrenzte Werte zu speichern. Es verletzt 1NF und ist ein ernster Schmerz, mit dem man arbeitet. –

+0

vgl. http://StackOverflow.com/a/13873801/2630032 –

Antwort

0

Obwohl ich sehr raten, sich von begrenzten Werten zu trennen, wenn Sie sie zu benutzen haben , können Sie die folgende Methode verwenden:

Erstellen Sie die Tabelle Funktion:

CREATE FUNCTION dbo.splitStringByPipe 
(@string nvarchar(500)) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT 
    Split.a.value('.', 'VARCHAR(100)') AS String 
FROM (SELECT 
     CAST ('<M>' + REPLACE(@string, '|', '</M><M>') + '</M>' AS XML) AS String) AS A CROSS APPLY String.nodes ('/M') AS Split(a)  
) 
GO 

Die Funktion ausführen:

SELECT * FROM dbo.splitStringByPipe('1|a|5|z|r') 

Returns:

| String 
1 | 1 
2 | a 
3 | 5 
4 | z 
5 | r 
+0

Ich möchte die '1' zählen, nachdem die Ausgabe wie gewünscht empfangen wurde. Bitte Hilfe geben –

+0

Bitte geben Sie ein Beispiel für die Tabelle, aus der Sie auswählen werden, und Ihre endgültige gewünschte Ausgabe. Ohne etwas über Ihre Struktur zu wissen, kann ich meine Antwort nicht weiter ausführen. – Santi

0

FOR XML (SQL Server)

Eine SELECT-Abfrage gibt die Ergebnisse als rowset. Sie können optional formale Ergebnisse einer SQL-Abfrage als XML abrufen, indem Sie die XML-Klausel FOR in der Abfrage angeben.

More Detail for XML(SQL Server)

;WITH CTE1 
AS 
(
SELECT CAST(('<r><c>' + REPLACE(TestColumn, '|', '</c></r><r><c>') + '</c></r>') AS XML) XmlColumn 
FROM tbl_Employee 
), 
TBL2 
AS 
(
SELECT CAST(Col.query('./text()') AS VARCHAR(10))Result 
FROM 
CTE1 CROSS APPLY 
XmlColumn.nodes('/r/c') As Tab(Col) 
) 
SELECT * FROM TBL2 

Ausgang:

Result 
- 1 - 
- 2 - 
- 3 - 
- 4 - 
- 5 - 
Verwandte Themen