Toon posts:

[MS SQL] Rijen achter elkaar plakken

Pagina: 1
Acties:
  • 367 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met een SQL statement dat het volgende moet doen:
Alle verantwoordelijken selecteren die aan een bepaalde voorwaarde voldoen, en weergeven als een lijst die door komma's gescheiden wordt.

Wat ik momenteel kan doen is een aantal rijen terugkrijgen, dus van de vorm:

Gebruiker 1
Gebruiker 2
...

Dit wil ik dus laten omzetten naar Gebruiker 1, Gebruiker 2,... en dit allemaal in MS SQL zelf.

Dit is nodig omdat ik alle verantwoordelijken voor een bepaalde job moet hebben, en dit voor meerdere jobs. Programmatisch kan ik dit wel realiseren maar dan kan ik het totaalresultaat niet meer als een dataset returnen, wat essentieel is. (Waarschijnlijk gaat dit wél maar ik denk dat die programma-code me iets té gevordert is).

  • P_de_B
  • Registratie: Juli 2003
  • Niet online

Oops! Google Chrome could not find www.rijks%20museum.nl


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:23

mulder

ik spuug op het trottoir

Wat is een dataset in jou ogen?

Je kunt in sql met een table cursor wel door een sql statement heen fietsen en dan een string aan elkaar plakken

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ik heb met Coalesce geprobeert te bereiken wat ik wou maar dit werkt niet volledig.

Ik gebruik volgende code:
code:
1
2
3
4
5
6
DECLARE @Verantwoordelijke varchar(255)
SELECT @Verantwoordelijke = COALESCE(@Verantwoordelijke + ', ','') + Persoonlijke_gegevens.Voornaam + ' ' + Persoonlijke_gegevens.Achternaam 
FROM Persoonlijke_gegevens, Verantwoordelijken, Jobs 
WHERE Persoonlijke_gegevens.Volgnummer = Verantwoordelijken.Volgnummer AND Verantwoordelijken.Jobnummer = Jobs.Jobnummer

SELECT Jobs.Werkplaats, @Verantwoordelijke FROM Jobs


Hiermee wil ik bereiken dat MS SQL alle Jobs.Werkplaatsen afgaat en daarbij elke keer opnieuw de variabele @Verantwoordelijke maakt.
Wat MS SQL echter doet is 1x de @Verantwoordelijke-variabele opvullen met ALLE waarden die voorkomen in Jobs.Jobnummer. Dit is dus niet wat ik wil hebben.

Ik heb geprobeert om de Jobs.Werkplaats rechtstreeks in de eerste select te plaatsen maar dat mag niet.

Even verduidelijken met een voorbeeld:
Ik kan met gewone SQL-statements
"Toog 3" "Gebruiker 1"
"Toog 3" "Gebruiker 2"
"Toog 4" "Gebruiker 3"
"Toog 5" "Gebruiker 4"
...

En ik wil krijgen:
"Toog 3" "Gebruiker 1, Gebruiker 2"
"Toog 4" "Gebruiker 3"
"Toog 5" "Gebruiker 4"

Wat ik met COALESCE kan bereiken is:
"Toog 3" "Gebruiker 1, Gebruiker 2, Gebruiker 3, Gebruiker 4"
"Toog 4" "Gebruiker 1, Gebruiker 2, Gebruiker 3, Gebruiker 4"
"Toog 5" "Gebruiker 1, Gebruiker 2, Gebruiker 3, Gebruiker 4"

[ Voor 25% gewijzigd door Verwijderd op 21-03-2005 20:23 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Kijk eens naar CURSORS in SQL Server;

Echter, ik ben van mening dat je met SQL gewoon maar je data moet ophalen; SQL mag imho niet verantwoordelijk zijn voor het formatteren van de data. Maw, SQL moet zich helemaal niet moeien met hoe die gegevens moeten getoond worden.
Dit moet je dan maar in je applicatie zelf gaan afhandlen.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik begrijp niet precies wat je wilt, kun je misschien wat voorbeelden geven van data en de gewenste output?

Overigens kun je deze code ook in een User Defined Functie opnemen, die je dan inline kunt aanroepen, het lijkt me dat dat iets is waar je wel wat mee kan:

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op maandag 21 maart 2005 @ 20:25:
Ik begrijp niet precies wat je wilt, kun je misschien wat voorbeelden geven van data en de gewenste output?

Overigens kun je deze code ook in een User Defined Functie opnemen, die je dan inline kunt aanroepen, het lijkt me dat dat iets is waar je wel wat mee kan:
Een User Defined Functie deed alles wat ik wou bereiken. Bedankt iedereen!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar wat is nou precies de reden dat je dit in de database wilt doen en niet in je applicatie zelf? Dat je het niet als een DataSet kan retourneren?

Waarom zou je dat perse willen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op maandag 21 maart 2005 @ 21:13:
Maar wat is nou precies de reden dat je dit in de database wilt doen en niet in je applicatie zelf? Dat je het niet als een DataSet kan retourneren?

Waarom zou je dat perse willen?
De preciese reden is de volgende:

Het stuk waarin ik de SQL-statement plaats maakt deel uit van een webservice.
Ik wil een dataset returnen omdat het resultaat in een repeater terechtkomt. In die repeater moet ik zowel de jobs als de verantwoordelijken die erbij horen weergeven. Aangezien ik geen oplossing vond om meerdere datasets aan een repeater te koppelen was dit de makkelijkste oplossing. In die ene dataset staan nu zowel de verantwoordelijken als de jobs waardoor ik makkelijk alle informatie in de repeater krijg.

Ik denk wel dat er een manier moet zijn om eenvoudige statements uit te voeren, die nadien in de applicatie in de gewenste vorm te gieten en dan pas een dataset aanmaken. Dit lijkt mij echter nogal omslachtig en niet zo eenvoudig. Daarom ging ik liever op zoek naar een manier om een statement te maken die meteen het correcte resultaat teruggeeft aan de applicatie. Dan kan ik in de applicatie heel snel een dataset laten maken die alles bevat wat ik wil.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hoeft niet perse een DataSet aan een repeater te binden. Je kunt een repeater ook rustig binden met een List van Custom objecten.

Dan kan je het ophalen van de verantwoordelijke alsnog in je eigen applicatie doen. En ik vermoed dat je in .net werkt aangezien je het over Repeaters en DataSets hebt. In .net kan je rustig een DataTable aanmaken zonder dat er ooit een database aan te pas is gekomen. Dus je kan altijd nog je data in een nieuwe DataTable ( of Set ) gieten. Maar zelf zou ik eerder voor Custom Objecten gaan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1