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