Benutzer mit den meisten Antworten
@@ROWCOUNT gibt falsche Werte zurück

Frage
-
Hallo,
eigentlich gibt @@ROWCOUNT die Anzahl der selectierten oder betrofenene Zeilen zurück. In meiner Stored-Procedure
bekomme ich aus irgend einen Grund immer 0 als Wert zurück(Select @zugewiesen=@@ROWCOUNT)
Hier die Stored Procedure.
ALTER PROCEDURE dbo.Pruefe_zugeordnetet_Designelemente_zu_VA ( --@VA_ID int, @EB_Nr char, @zugewiesen bit output ) AS DECLARE @Designelemente_zugewiesen int; Declare @rowscount int; SELECT SD_MElement_Merkmal.Bezeichnung, SD_MElement_Eigenschaft.Bezeichnung AS Expr1, SD_MElement.MElement_Bez, Erprobungsblatt.EB_Nummer, SD_MElement_Merkmal.MElement_Eigenschaft_ID, SD_MElement_Eigenschaft.MElement_ID FROM Pruefling INNER JOIN Versuchsauftrag_Pruefling ON Pruefling.Pruefling_ID = Versuchsauftrag_Pruefling.Pruefling_ID INNER JOIN SD_BNummer ON Pruefling.BNummer = SD_BNummer.BNummer INNER JOIN SD_MElement_Eigenschaft INNER JOIN SD_MElement ON SD_MElement_Eigenschaft.MElement_ID = SD_MElement.MElement_ID INNER JOIN SD_MElement_Merkmal ON SD_MElement_Eigenschaft.MElement_Eigenschaft_ID = SD_MElement_Merkmal.MElement_Eigenschaft_ID INNER JOIN BNummer_MElement ON SD_MElement_Merkmal.MElement_Merkmal_ID = BNummer_MElement.MElement_Merkmal_ID ON SD_BNummer.BNummer = BNummer_MElement.BNummer INNER JOIN Versuchsauftrag ON Versuchsauftrag_Pruefling.VA_ID = Versuchsauftrag.VA_ID INNER JOIN Erprobungsblatt ON Versuchsauftrag.EB_ID = Erprobungsblatt.EB_ID WHERE (Erprobungsblatt.EB_Nummer = @EB_Nr) SELECT @rowscount = @@ROWCOUNT if @@ROWCOUNT != 0 begin Select @zugewiesen = 0 end /* SET NOCOUNT ON */ RETURN
Antworten
-
denkst Du nicht, dass dies vielleicht daran liegen koennte, dass Du nach der grossen Select Anweisung den Wert von @@ROWCOUNT der Variable @@rowscount (SELECT @rowscount=@@ROWCOUNT) zuweist und dieses setzt dann @@ROWCOUNT immer auf 1 da das zweite SELECT statement den Wert von @@ROWCOUNT neu setzt.
Der Code muesste dann wohl so heissen (Verwendung von @@rowscount in IF statement statt @@ROWCOUNT)
SELECT @rowscount = @@ROWCOUNT if @@rowscount != 0 begin Select @zugewiesen = 0 end /* SET NOCOUNT ON */ RETURN
ueberdies faellt mir auf, dass @zugewiesen als output definiert ist aber nur am Schluss in der IF Anweisung gesetzt wird, denkst Du nicht auch, dass es sicherer waere, @zugewiesen immer einen Wert zuzuweisen, damit sie einen definierten Wert hat.
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.
- Bearbeitet Daniel_Steiner Dienstag, 22. Mai 2012 14:48
- Als Antwort vorgeschlagen Christian C Gräfe Dienstag, 22. Mai 2012 17:35
- Als Antwort markiert intern2011 Donnerstag, 24. Mai 2012 09:26
Alle Antworten
-
denkst Du nicht, dass dies vielleicht daran liegen koennte, dass Du nach der grossen Select Anweisung den Wert von @@ROWCOUNT der Variable @@rowscount (SELECT @rowscount=@@ROWCOUNT) zuweist und dieses setzt dann @@ROWCOUNT immer auf 1 da das zweite SELECT statement den Wert von @@ROWCOUNT neu setzt.
Der Code muesste dann wohl so heissen (Verwendung von @@rowscount in IF statement statt @@ROWCOUNT)
SELECT @rowscount = @@ROWCOUNT if @@rowscount != 0 begin Select @zugewiesen = 0 end /* SET NOCOUNT ON */ RETURN
ueberdies faellt mir auf, dass @zugewiesen als output definiert ist aber nur am Schluss in der IF Anweisung gesetzt wird, denkst Du nicht auch, dass es sicherer waere, @zugewiesen immer einen Wert zuzuweisen, damit sie einen definierten Wert hat.
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.
- Bearbeitet Daniel_Steiner Dienstag, 22. Mai 2012 14:48
- Als Antwort vorgeschlagen Christian C Gräfe Dienstag, 22. Mai 2012 17:35
- Als Antwort markiert intern2011 Donnerstag, 24. Mai 2012 09:26
-
Hallo,
@@ROWCOUNT wird durch jede SELECT Anweisung neu gesetzt.
In Deinem Falle bewirkt das SELECT @rowscount = @@ROWCOUNT eine neue Zuweisung.Ändere den Code am Ende ab in:
SELECT @rowscount = @@ROWCOUNT; IF @rowscount > 0 SET @zugewiesen = 0; ELSE SET @zugewiesen = 1; // oder NULL? RETURN 0;
Beachte, dass @zugewiesen in beiden Fällen ein Ergebnis "zugewiesen" wird.
Denn ansonsten würde im Falle keines Treffers der vorherige Inhalt von @zugewiesen oder NULL darin stehen,
wenn die Variable nicht initialisiert wurde - was weitere Probleme hervorrufen könnte.Gruß Elmar
-
Hi,
du benutzt direkt nach deiner Abfrage das Statement
select @rowscount = @@ROWCOUNT
Dadurch wird die Variable @@ROWCOUNT immer auf 1 gesetzt! Da dies ja das letzte Statement ist.
Als nächstes fragst du nicht die variable @rowscount sondern @@ROWCOUNT ab
if @@ROWCOUNT != 0 begin Select @zugewiesen = 0 end
Da @@ROWCOUNT in diesem Moment 1 ist, wird natürlich der Variablen @zugewiesen der Wert 0 zugeteilt und dieser wird von der Prozedur ausgegeben.
An welcher Stelle hast du jetzt das Problem mit dem @@ROWCOUNT, da dein angesprochenes Statement (Select @zugewiesen=@@ROWCOUNT) nicht vorkommt.
Grüße
Oliver
-
Hallo,
vielen Dank für die Hilfe.
@Oliver: Ursprünglich hatte ich
if @rowscount !=0
abgefragt :).Hab gestern ziemlich oft den code verändert und am Ende ist das rausgekommen.
In einer anderen StoredProcedure haben wir sowas ähnlich auch schon benutzt und dort funktioniert es komischerweise.
SELECT ... FROM Arbeitsgang
WHERE (VA_ID = @VA_ID)
SELECT @AG_Gesamt = @@ROWCOUNT
Gruß
Intern2011
-
Wie auch immer. Es funktioniert jetzt und ich habe auch das Problem erkannt:).
Wir hatten in einer anderen SP mehrere Selecet abfragen und deshalb @@Rowcount immer einer
Variable zugewiesen. In meinen Fall ist das aber nicht notwendig.
Gruß
intern2011
-
Wie auch immer. Es funktioniert jetzt und ich habe auch das Problem erkannt:).
Wir hatten in einer anderen SP mehrere Selecet abfragen und deshalb @@Rowcount immer einer
Variable zugewiesen. In meinen Fall ist das aber nicht notwendig.
Gruß
intern2011
hallo intern2011
kannst Du die Antwort markieren welche Dir bei diesem Problem geholfen hat, damit dieser Thread als beantwortet markiert wird?
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.