aasahMedlem sedan mars 20033 451 inlägg
Har följande lilla skript:
DECLARE @rows int
SELECT 1, 5
SELECT @@ROWCOUNT AS Immidiately
SET @rows = @@ROWCOUNT
SELECT @rows AS First
if @@ROWCOUNT > 0
BEGIN
SELECT @@ROWCOUNT AS Inside
SET @rows = @@ROWCOUNT
END
ELSE SET @rows = 6
SELECT @rows AS Outside
Den skriver ut
Immidiately - 1
First - 1
Inside - 0 <--------- ?????
Outside - 1
Någon som kan förklara hur eländet kan vara 0 inne i en if-satsdel som man bara hamnar i om den är > noll??? :q
Vad är det egentligen som händer här?
GeinMedlem sedan sep. 20004 849 inlägg
Du kan bara hämta värdet ur @@ROWCOUNT en gång.
Testa detta:
SELECT 1
PRINT @@ROWCOUNT
PRINT @@ROWCOUNT
Varje gång du kör en SELECT-fråga så genereras ett nytt värde för @@ROWCOUNT, även de gånger när du kör SELECT för att hämta ut värdet ur @@ROWCOUNT. Därför ska du alltid spara undan värdet i @@ROWCOUNT till en variabel om du behöver dess värde flera gånger.
För att försöka beskriva din kod:
DECLARE @rows int
SELECT 1, 5
SELECT @@ROWCOUNT AS Immidiately [B][I]rowcount är här 1 eftersom föregående rad genererade en rad.[/I][/B]
SET @rows = @@ROWCOUNT [B][I]@rows sätts till 1 eftersom föregående rad (OBS! Alltså SELECT @@ROWCOUNT...-raden) genererade en rad[/I][/B]
SELECT @rows AS First
if @@ROWCOUNT > 0 [B][I]Ja, @@rowcount är större än 0 eftersom SELECT @rows ... genererade en rad.[/I][/B]
BEGIN
SELECT @@ROWCOUNT AS Inside [B][I]Här är @@rowcount 0 eftersom vi inte har hämtat någon resultatmängd sen vi senaste hämtade (och därmed också tömde) @@rowcount [/I] [/B]
SET @rows = @@ROWCOUNT [I][B]@rows sätts till 1 eftersom raden ovanför genererade en resultatmängd innehållande 1 rad.[/B][/I]
END
ELSE SET @rows = 6
SELECT @rows AS Outside
Det jag tror du snurrar bort dig på är att varje gång du hämtar värdet ur @@ROWCOUNT så töms samma variabel.
aasahMedlem sedan mars 20033 451 inlägg
Tusen tack för ett mycket klargörande och bra svar, Gein! :birp
För övrigt var din hypotes riktig...