SQL Per select string zusammensetzen

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.404
Hallo

Hier ein einfaches Beispiel was ich brauche:
Eine Tabelle mit zwei Spalten: ID und Nachname

Nun sollen alle Nachnamen mit einem select Behlen ausgegeben werden.
(select namename from tabelle)
Aber die Namen sollen alle als eine lange zeichenkette zurückkommen (getrennt mit einem Leerzeichen).
ist das möglich?

z.B.

--ID----Nachname
-1------Mustermann
-2------Bauer
-3------Schmitz


Dann soll die Ausgabe lauten: "Mustermann Bauer Schmitz"


Danke
 
Wieso muss das in SQL passieren? Kannst du doch einfach in deinem Anwendungscode machen.
 
cx01 schrieb:
Wieso muss das in SQL passieren? Kannst du doch einfach in deinem Anwendungscode machen.

Nein, es muss in SQL sein! Die Begründung wäre sehr sehr lang. Dies ist nur ein ganz kleines Unterproblem.
 
Hab zwar ned genau verstanden, was du vorhast, aber das könnte dir vllt. weiterhelfen ;)
 
Leider ist dies keine Hilfe:
select CONCAT (namename) from tabelle
funktioniert nicht.


P.S. Es wird MS SQL 2008 benutzt
 
Ich weiß zwar nicht wie du das ganze weiterverwenden willst, aber in verschiedenen Sprachen gibt es sowas in der Art:

Hier mal iverinfacht dargestellt

alleNamen = ...Lese ersten Name...

alleNamen += " " + alleNamen;

So wird der erste Namen ausgelesen und jeder folgende drangehangen, so das du am Ende einen langen String mit allen Namen hast.

Gruß

HD
 
@HansDampf38

Dies ist mir für andere sprachen bekannt.

Hier wird es aber in SQL benötigt.

Danke
 
In MySQL geht das mit group_concat, z.b. "select group_concat(nachname) from tabelle". Vlt findest du im Internet heraus, wie man diese Funktion in SQL Server nachbildet.
 
cx01 schrieb:
In MySQL geht das mit group_concat, z.b. "select group_concat(nachname) from tabelle". Vlt findest du im Internet heraus, wie man diese Funktion in SQL Server nachbildet.

leider finde ich da nix


Dies muss doch möglich sein?!?
 
Code:
DECLARE @Namen VARCHAR(8000)
SELECT @Namen=ISNULL(@Namen + ' ', '') + NACHNAME FROM MITARBEITER
SELECT @Namen
GO

Ist zwar leider kein einzelnes SELECT jedoch könntest du evtl. eine BindVariable verwenden, dann würde man sich wahrscheinlich die Deklaration und das 2. SELECT ersparen. Aber Vorsicht, bei großen Listen die über VARCHAR(8000) gehen wirds problematisch bzw. nicht mehr so funktionieren.
 
Ist nicht eine Antwort auf deine Frage, eher eine beiläufige Überlegung meinerseits:

Ich weiß ja nicht was du genau in Betrieb nehmen willst (wieviele Datensätze,User,Abfragen pro Zeit etc.), aber ich hätte bei der Vorgehensweise ("Riesenstring") Bedenken zwecks (Datenbank-)Serverlaufzeit/optimierung.

Ich kenn mich mit MS SQL nicht aus, aber ich denke da muss der alles im Serverspeicher erstmal zusammenbauen (Caching....)

Also für den Fall daß da viele Abfragen in kurzen Zeitabständen kommen, geht der Server evtl. in die Knie
 
@refri89: Sind das nicht immer allgemeine Überlegungen die grundsätzlich gemacht werden müssen? Im übrigen ist der SQLServer ein relativ starkes Ding, das nicht so ohne weiteres in die Knie gezwungen werden kann. Im übrigen kann der SQLServer, zumindest bis Version 2005, mit Strings in der Größe von 2 GB umgehen, was also bei weitem ausreichen sollte. Das wäre dann der TEXT Datentyp. Bei "normalen" VARCHAR ist bei 8000 Zeichen Schluß gewesen. Der 2008 ist da ebenbürtig und wird unter Umständen die VARCHAR Grenze vielleicht sogar weiter nach oben aufgebohrt haben. Nur wenn der zusammengebaute String die VARCHAR Grenze übersteigt, wirds eine Fehlermeldung geben und fertig. Das stört SQLServer da nicht, er führt halt das SELECT nicht aus bzw. bricht ab.
 
Geb dir in allem Recht, nur eines muß dennoch gesagt werden: SQL Server kann mit 2GB String umgehen, aber ich sagte ja nicht daß ers nicht kann, aber denk mal 500 User pro Minute machen die Abfrage, denk nicht daß der Server 500x2GB Speicher drin hat...
 
Bei 1.000.000 Benutzernamen in einer Tabelle und einer durchaus positiv geschätzten durschnittlichen Länge von ca. 30 Zeichen je Namen würden bei UTF 16 ca. 28GB Daten anfallen, wenn 500 Anwender das gleiche abfragen, mal abgesehen davon das die Daten bei der 1. Abfrage temporär in einen Cache fliessen. Bei einer Minute als Zeitrahmen besteht eine sehr hohe Chance, dass jede weitere Abfrage aus dem Cache bedient wird. Aus meiner Sicht wäre das bei SQLServer 2008 durchaus machbar. Da aber z.B. in meiner zuvor geposteten Abfrage VC 8000 verwendet wird. Ist man extrem weit unter diesen Werten. Und wie gesagt bei VC 8000 wäre relativ schnell Schluß, sowie eine Liste mit 1.000.000 Benutzernamen nicht machbar. Ebenso muss SQLServer diese Menge an Daten bewegen können, ob nun Zeile für Zeile oder als ein einzelner Wert. Die 2 GB sind auch nur ein theoretischer Wert, dessen Praxis ich bisher bei den unterschiedlichsten Datenbanken auf SQLServer Basis noch nicht erlebt habe. Aber es besteht dennoch die Möglichkeit, dass dies einmal eintreten wird.

Korrigiere mich, wenn ich falsch liege, denn man lernt halt nie aus. ;)
 
Zurück
Oben