none
@@ROWCOUNT gibt falsche Werte zurück RRS feed

  • 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
     
    
    Dienstag, 22. Mai 2012 13:26

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.


    Dienstag, 22. Mai 2012 14:46

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.


    Dienstag, 22. Mai 2012 14:46
  • 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

    Dienstag, 22. Mai 2012 14:50
    Beantworter
  • 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

    Dienstag, 22. Mai 2012 14:51
  • 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

    Mittwoch, 23. Mai 2012 11:40
  • 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

    Mittwoch, 23. Mai 2012 11:46
  • 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.

    Mittwoch, 23. Mai 2012 18:32