Hej Varför vill du ha en komma separerad rad med poster från en tabell? Min applikation är ett ärendehanteringssystem för programvaruutvecklingsföretag. Varje ärende (bugg, önskemål e t c) kan kopplas till en eller fler kunder. Så det är i ärendelistan som jag vill visa vilka kunder som ärendet är kopplat till, genom att skapa en kommaseparerad lista på kunder/kundnummer i vyn som jag använder för detta. Ahh då hänger jag med! Vem vill sitta och glo på en kommaseparerad lista med unika ID:n då? Det känns inte som att beställaren har tänkt rätt? :) En bättre lösning är kanske att visa en COUNT(customerId) och visa det som en klickbar länk t.ex. [4 st] och när man klickar på den fälls det ned en ruta eller poppar upp ett fönster med en lista på dessa kunders namn osv. Klassisk master/details lösning. Och kanske trevligare för användaren egentligen. För hur blir din lista om 28 kunder har ett ärende. Det blir nog inte snyggt att 28 unika ID:n skall visas i en kolumn. Det är iofs inte ID:na som listas, utan en lista med kundnamn och en lista med kundnummer...men jag gillar ändå tanken med den klickbara länken och sedan öppna ett detailfönster. Det kan vara enklare väg än hierarkisk data om jag inte lyckas lösa kommasepareringen. Om du använder 2005/2008 kan du göra på följande sätt (hoppas jag klistrade in rätt från din fråga). Det ser ut som att det fungerar som jag vill att det ska göra. Jag skall testa om prestandan är acceptabel när jag kommer hem ikväll...Tack för tipset... Jag får inte riktigt till det i mitt sammanhang dock. Min huvudtabell heter Task och Customer innehåller så klart de rader som skall kommasepareras. Mellan dessa finns Rel_TaskCustomr, en kopplingstabell (många-till-många). Prova detta: Japp, den gamla lösnignen tog 3.5 minuter, nu tog den 5 sekunder för 10000+ poster, så det var stooooor skillnad :-)Skapa kommaseparerad sträng i SQL
Är det någon som vet hur man kan skapa en kommaseparerad sträng utifrån rader i en tabell på ett ännu enklare sätt än detta?
<code>
DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +
CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
SELECT @EmployeeList
</code>
Problemet med ovanstående är att det måste läggas i en UDF och att det blir väldigt långsamt. Jag skulel vilja hitta en lösning där man slipper anropet till UDF:en, dvs så att den blir inline och kan läggas direkt i vyn där den kommaseparerade strängen skall in. Just nu så tar det för 12000 poster 3.5 minuter (!) att bli klar, medans det om jag ej tar med de två kommaseparerade fälten endast tar ca 5 sekunder...Det är alltså en helt oacceptabel prestandaförlust med ovanstående metod :-(Sv: Skapa kommaseparerad sträng i SQL
Brukar vara intressant att veta! :)Sv:Skapa kommaseparerad sträng i SQL
Ett sätt att komma runt detta är att använda hirarki-funktionalitetn i gridden (Janus GridEx), med kunderna som egna rader under ärendena, men det kräver ju lite jobb att få det att funka och jag måste släppa en ny version ganska omgående.Sv: Skapa kommaseparerad sträng i SQL
När det är omgående då är det kämpigt.. Sv: Skapa kommaseparerad sträng i SQL
Sv:Skapa kommaseparerad sträng i SQL
Sv: Skapa kommaseparerad sträng i SQL
<code>
SELECT SUBSTRING((SELECT (', ' + Emp_UniqueID)
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
FOR XML PATH('')), 3, 2000) AS EmployeeList
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1;
</code>
Att du får prestandasänkning med UDF är inget konstigt då den ger ett Cursorliknande beteende.
Till Pontus: Cursor är aldrig rätt verktyg vid prestanda (aldrig annars heller, om det kan undvikas).
/HåkanSv:Skapa kommaseparerad sträng i SQL
Sv:Skapa kommaseparerad sträng i SQL
Task:
ID
Header
Rel_TaskCustomer:
TaskID
CustomerID
Customer:
ID
Name
Så här långt har jag kommit :
<code>
SELECT ID, Header ,(
SELECT SUBSTRING((SELECT (', ' + Customer.Name)
FROM Rel_TaskCustomer
LEFT OUTER JOIN Customer ON Customer.ID = Rel_TaskCustomer.CustomerID
WHERE Rel_TaskCustomer.TaskID = Task.ID
FOR XML PATH('')), 3, 2000) AS CustomerList
FROM Rel_TaskCustomer
WHERE Rel_TaskCustomer.TaskID = Task.ID
) as CustomerList
FROM Task
</code>
Det ger dock följande fel:
<info>
Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
</info>
Data returneras dock, men fälter CustomerList blir null hela tiden....Sv: Skapa kommaseparerad sträng i SQL
<code>
SELECT
ID,
Header,
CustomerList = SUBSTRING((SELECT (', ' + [Name])
FROM Customer
WHERE ID IN (SELECT CustomerID FROM Rel_TaskCustomer WHERE TaskID = Task.ID)
FOR XML PATH('')), 3, 2000)
FROM Task
GROUP BY ID, Header;
</code>
/HåkanSv:Skapa kommaseparerad sträng i SQL