webForumDet fria alternativet

@@ROWCOUNT - Transact-SQL

2 svar · 561 visningar · startad av aasah

aasahMedlem sedan mars 20033 451 inlägg
#1

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
#2

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
#3

Tusen tack för ett mycket klargörande och bra svar, Gein! :birp

För övrigt var din hypotes riktig...

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb