Har ett litet bekymmer. Och när man har haft det ett tag så tar man sig hit och ställer sin fråga här =) Finns det några null-värden i kolumnen? Jag såg nämligen att du tillåter null-värden i den, och beroende på vilka databasinställningar databasen har så kan problemet bero på detta. Det finns nämligen en option som heter 'concat null yields null', vilken innebär att om man konkatenerar en sträng med ett null-värde så blir resultatet null. Alltså, även om du bara har ett nullvärde i tabellen så kommer slutresultatet att bli null. CREATE FUNCTION getStatus () Tackar!Stränghantering med tSQL
Sitter och meckar med en function som ska returnera alla statusnamn i en enda sträng. Men det vill sig inte.
SET @str= @str + @str2 - returnerar NULL
men
SET @str= @str2 - returnerar det sista statusnamnet i cursorn.
Är det så att när man kör en SET så nollställs värdet på variablen som man skall tilldela innan själva tilldelningen sker? (Vilket det inte gör i vårt kära VB.)
<code>
CREATE FUNCTION getStatus ()
RETURNS varchar(4096)
AS
BEGIN
DECLARE @str2 varchar(4096)
Declare @str varchar(4096)
DECLARE Status CURSOR FOR
SELECT tStatus.statusName From tStatus order by tStatus.statusName desc
OPEN status
WHILE @@FETCH_STATUS = 0
BEGIN
SET @str= @str + @str2
FETCH NEXT FROM status INTO @str2
END
CLOSE status
DEALLOCATE status
return(@str)
end
</code>
tStatus:
CREATE TABLE [tStatus] (
[StatusId] [int] IDENTITY (1, 1) NOT NULL ,
[StatusName] [varchar] (50) COLLATE Finnish_Swedish_CI_AS NULL ,
[StatusDescription] [varchar] (2000) COLLATE Finnish_Swedish_CI_AS NULL
) ON [PRIMARY]Sv: Stränghantering med tSQL
För att byta ut null mot en tom sträng kan du köra:
SET @str = ISNULL(@str, '') + ISNULL(@str2, '')
istället för
SET @str= @str + @str2
Kör nedanstående för att kolla inställningen:
sp_dboption 'database', 'concat null yields null'
Kör nedanstående för att ändra den:
sp_dboption 'database', 'concat null yields null', 'false'
Hmmmm...nu när jag tänker efter så ser jag problemet. @str och @str2 är inte initierade när du går in i loopen, och du kör din fetch efter första tilldelningen, så de kommer bägge att vara null vid första tilldelningen. Alltså får du ett null-värde som följer med hela tiden. Ändra din deklaration till nedanstående så ska det nog fungera (men testa gärna att kolla inställningen ovan och prova att ändra den på test, även om den bör vara true annars):
DECLARE @str2 varchar(4096)
Declare @str varchar(4096)
SET @str = ''
SET @str2 = ''Sv: Stränghantering med tSQL
RETURNS varchar(4096)
AS
DECLARE @str varchar(4096)
SELECT @str = COALESCE(@str,'') + statusName from tstatus order by statusName
return @strSv: Stränghantering med tSQL
Jo, det var helt korrekt att null + stäng ger null. När de var initierade samt att jag gjorde en koll så att det som lades till inte kunde vara null så gick det som smort..
/Rickard