Hej. Har för mig att man inte kan köra en update på en join. Men annars så kanske detta fungerar: Jodå, du kan joina i en update. Dock var där något enstaka fel i ditt exempel. Följande kod ger alla telefonnummer i PhoneNumbers-fältet. Observera att den förutsätter att cID och pID är något heltalsid-fält som är primärnyckel. Nu är jag hemma. Var på väg till träningem så hade ingen möjlighet att testa. Det är sant, det är något effektivare att bygga upp phonenumbers-strängen i en sql-fråga istället för i en loop som jag gjorde, men det viktigaste är iaf att man inte använder en cursor för att göra det. Jag löste frågan med eran hjälp. Tack för det! Prova detta: TACK, TACK, TACK, TACK, TACK!!!! Anledningen till NOCOUNT ON/OFF är att du bara kan få ett resultsetRader till en kolumn  (MER BEKYMMER!!)
    
    
Anta att jag har två tabeller: 
'tblCustomer' men följande fält:
-cID
-cFirstName
-cLastName
'tblPhone':
-pID
-cID
-pNumber
Min fråga är:
Hur gör jag om jag vill samla alla kundens telefonnummer i en enda kolumn? Gärna kommaseparerade...
Mitt önskade format från DB:n är alltså:
cID, cFirstName, cLastName, PhoneNumbersSv: Rader till en kolumn
    
    
CREATE TABLE #Result (cID INT, cFirstName VARCHAR(50), cLastName VARCHAR(50), PhoneNumbers VARCHAR(255))
INSERT INTO #Result (cID, cFirstName, cLastName, PhoneNumbers) 
SELECT (cID, cFirstName, cLastName, '') 
FROM tblCustomer
UPDATE #Result INNER JOIN tblPhone ON #Result.cID = tblPhone.cID SET PhoneNumbers = PhoneNumbers + ', ' + tblPhone.pNumber
SELECT * 
From #Result
DROP TABLE #ResultSv: Rader till en kolumn
    
    
CREATE TABLE #Result (cID INT, cFirstName VARCHAR(50), cLastName VARCHAR(50), PhoneNumbers VARCHAR(255))
INSERT INTO #Result (cID, cFirstName, cLastName, PhoneNumbers) 
SELECT cID, cFirstName, cLastName, ''
FROM tblCustomer
DECLARE @cID int, @pID int
SELECT @cID = MIN(cID) FROM #Result
WHILE @cID > 0
BEGIN
	SELECT @pID = MIN(pID) FROM tblPhone WHERE cID = @cID
	WHILE @pID > 0
	BEGIN
		UPDATE #Result SET PhoneNumbers = CASE WHEN LEN(PhoneNumbers) > 0 THEN PhoneNumbers + ',' + p.pNumber ELSE p.pNumber END
		FROM #Result r
		INNER JOIN tblPhone p ON r.cID = p.cID
		WHERE p.pID = @pID
		SELECT @pID = MIN(pID) FROM tblPhone WHERE cID = @cID AND pID > @pID
	END
	SELECT @cID = MIN(cID) FROM #Result WHERE cID > @cID
END
SELECT * 
From #Result
DROP TABLE #ResultSv: Rader till en kolumn
    
    
Fick lite insperation från din kod. Tror jag lyckats skriva ett effektivare sätt att utföra det på:
CREATE TABLE #Result (cID INT, cFirstName VARCHAR(50), cLastName VARCHAR(50), PhoneNumbers VARCHAR(255))
INSERT INTO #Result (cID, cFirstName, cLastName) 
SELECT cID, cFirstName, cLastName
FROM tblCustomer
DECLARE @cID int, @temp varchar(255)
SELECT @cID = MIN(#Result.cID) 
FROM #Result
WHILE @cID > 0
BEGIN
    SET @temp = ''
    SELECT @temp = @temp + ', ' + tblPhone.pNumber
    FROM tblPhone 
    WHERE cID = @cID
    IF @temp <> ''
    BEGIN
        SET @temp = SUBSTRING(@temp, 3, LEN(@temp))
        UPDATE #Result SET PhoneNumbers = @temp
        FROM #Result 
        WHERE #Result.cID = @cID
    END
    SELECT @cID = MIN(#Result.cID)
    FROM #Result
    WHERE #Result.cID > @cID
END
SELECT * 
FROM #Result
DROP TABLE #ResultSv: Rader till en kolumn
    
    Sv: Rader till en kolumn 
    
    
Nu har jag dessvärre mer bekymmer....
När jag kör frågan via Query Analyser fungerar det perfekt men när jag försöker anropa den via ADO så så får jag ett stängt recordset tillbaka....
Jag _vet_  (tror jag) :) att syntaxen i koden är korrekt. Anropar andra sp:s med parametrar och dom funkar bra...
Jag tror jag satt rätt rättigheter på den också.
Kan det ha med det temporära tabellen att göra??? Den tas ju bort efter att SQL Server levererat resultatet... ? Kanske ADO tappar nån referens till källan då?
Är det något speciellt skall tänka på när man arbetar med temporära tabeller??
Jag är säkert helt fel ute... snälla hjälp.
 Sv: Rader till en kolumn 
    
    
SET NOCOUNT ON
CREATE TABLE #Result (cID INT, cFirstName VARCHAR(50), cLastName VARCHAR(50), PhoneNumbers VARCHAR(255))
INSERT INTO #Result (cID, cFirstName, cLastName) 
SELECT cID, cFirstName, cLastName
FROM tblCustomer
DECLARE @cID int, @temp varchar(255)
SELECT @cID = MIN(#Result.cID) 
FROM #Result
WHILE @cID > 0
BEGIN
    SET @temp = ''
    SELECT @temp = @temp + ', ' + tblPhone.pNumber
    FROM tblPhone 
    WHERE cID = @cID
    IF @temp <> ''
    BEGIN
        SET @temp = SUBSTRING(@temp, 3, LEN(@temp))
        UPDATE #Result SET PhoneNumbers = @temp
        FROM #Result 
        WHERE #Result.cID = @cID
    END
    SELECT @cID = MIN(#Result.cID)
    FROM #Result
    WHERE #Result.cID > @cID
END
SET NOCOUNT OFF
SELECT * 
FROM #ResultSv: Rader till en kolumn 
    
    
Det funkade... Nu skall jag bara läsa vad kommandot gör... :)
 Sv: Rader till en kolumn 
    
    
tillbaka till VB.
Testar du att köra frågan som den såg ut från början kommer du se
att du får flera. NOCOUNT OFF talar om att du bara vill ha slutresultatet,
inte veta hur många rader som returnerats etc. I alla fall har jag fattat
det så, finns säkert de som kan utveckla om jag är ute på tunn is...
/Emma