JCB: Simple Stored Procedure funktioniert mal und mal nicht

Hallöchen!

Ich hab ein merkwürdiges Problem. Ich hatte eine Prozedur geschrieben, welche das Phänomen aufwies, dass sie mal funktionierte und mal nicht. Ich hab dann angefangen zu debuggen und mehrere SQLCodezeilen nach und rausgeschmissen. Ich bin jetzt soweit, dass nur noch folgendes übrig geblieben ist:

Alter Procedure QM_Test_100

@test int

AS

SELECT @test=123

return @test

Man sieht ja auf den ersten Blick, dass im Prinzip nicht viel passiert. Doch das Problem ist, dass die Prozedur mal mit und mal ohne Rückgabewert beendet wird. Ohne dabei irgendeine Struktur erkennen zu können. Das passiert scheinbar völlig willkürlich. Nehm ich jedoch den Parameter @test weg, und deklariere sie als Variable gibts _immer_ nen Rückgabewert. Ich hab das Gefühl, dass vielleicht mein RAM mitterweile ne Macke hat, denn ich hab vorher schon diverse Prozeduren geschrieben. Und da trat dieses Problem nicht auf.

Weiß jemand Rat??

Gruß,
Jan

PS: Als Server läuft der MS SQL Server 2000 (auf dem gleichen Rechner auf dem ich entwickle).

  1. Hallo JCB

    Alter Procedure QM_Test_100 @test int AS
      SELECT @test=123
    return @test

    Warum übergibst Du einen Wert, wenn Du ihn anschließend nur überschreibst?
    Ja, ich weiß, Du hast den Code zusammengestrichen. Ich würde es trotzdem nicht tun.

    Ich hab das Gefühl, dass vielleicht mein RAM mitterweile ne Macke hat, denn ich hab vorher schon diverse Prozeduren geschrieben. Und da trat dieses Problem nicht auf.

    Viel interessanter als Deine Stored Procedure ist der Aufruf. Kannst Du ausschließen, dass dabei ein Fehler auftritt. Es könnte beispielsweise der SP _kein_ Wert übergeben werden.

    PS: Als Server läuft der MS SQL Server 2000 (auf dem gleichen Rechner auf dem ich entwickle).

    Eine nicht ganz unwichtige Information. Ein DBMS läßt sich oftmals nicht leicht erraten.

    Freundliche Grüße

    Vinzenz

    1. Hi!

      Warum übergibst Du einen Wert, wenn Du ihn anschließend nur überschreibst?
      Ja, ich weiß, Du hast den Code zusammengestrichen. Ich würde es trotzdem nicht tun.

      Ich kann auch die SELECT-Anweisung weglassen, so dass er mir das zurückgeben soll, was ich als Parameter übergeben hab. Das Problem belibt jedoch weiterbestehen.

      Viel interessanter als Deine Stored Procedure ist der Aufruf. Kannst Du ausschließen, dass dabei ein Fehler auftritt. Es könnte beispielsweise der SP _kein_ Wert übergeben werden.

      Also, ich teste und entwickle die Prozeduren im MS Visual InterDev 6.0. Dort erscheint eine Eingabeaufforderung für den einzugebenen Parameter. Wird dieser nicht übergeben, wird die folgende Fehlermeldung ausgegeben:

      Ausführung von dbo."_Test".

      Die QM_Test_100-Prozedur erwartet den @test-Parameter; dieser wurde nicht übergeben.
      Ausführung von dbo."_Test" beendet.

      Und die _fehlerhafte_ Beendung der Prozedur sieht so aus:
      ***************
      Ausführung von dbo."QM_Test_100" ( @test = 1 ).
      Ausführung von dbo."QM_Test_100" beendet.
      ***************

      Richtig wäre aber:

      ***************
      Ausführung von dbo."QM_Test_100" ( @test = 1 ).

      Keine Zeilen betroffen.
      Es gibt keine weiteren Ergebnisse.
      @RETURN_VALUE = 123
      Ausführung von dbo."QM_Test_100" beendet.
      ***************

      Gruß,
      Jan

  2. Hallo,

    Der SQL code sieht etwas aus wie eine Mischung von Output und Return.

    Alter Procedure QM_Test_100

    @test int

    AS

    SELECT @test=123

    return @test

    Normalerweise deklariert man den RETURN-Parameter nach dem AS (was bei Dir ja auch funktioniert hat im Test). An der Stelle wo du den @test-Parameter deklariert hast wuerde ich eher einen OUTPUT Parameter erwarten.

    Gruss,
    Melanie

    1. Normalerweise deklariert man den RETURN-Parameter nach dem AS (was bei Dir ja auch funktioniert hat im Test). An der Stelle wo du den @test-Parameter deklariert hast wuerde ich eher einen OUTPUT Parameter erwarten.

      Hi!

      Im Prinzip haste recht. Hatte ich auch schon alles. Das Problem war jedoch immer das gleiche. Ich kann auch die SELECT-Anweisung weglassen, es bleibt alles beim Alten :/.

      Gruß,
      Jan

      1. Hi,

        Im Prinzip haste recht. Hatte ich auch schon alles. Das Problem war jedoch immer das gleiche.

        Hattest Du nicht erwaehnt dass es klappt wenn Du  den Parameter @test wegnimmst, und es stattdessen als Variable deklarierst? Das waere das normale Verfahren fuer einen selbstdefinierten RETURN Wert.
        Wenn Du es oben bevor dem AS lassen willst solltest Du es mit @test int OUTPUT versuchen, und den Code entsprechend umschreiben.

        Gruss,
        Melanie

        1. Hi!

          Hattest Du nicht erwaehnt dass es klappt wenn Du  den Parameter @test wegnimmst, und es stattdessen als Variable deklarierst? Das waere das normale Verfahren fuer einen selbstdefinierten RETURN Wert.
          Wenn Du es oben bevor dem AS lassen willst solltest Du es mit @test int OUTPUT versuchen, und den Code entsprechend umschreiben.

          Also, bevor Missverständnisse auftreten ;): mein eigentliches Ziel ist es, eine "stinknormale" Prozedur zu schreiben, an die ich 3 Parameter übergeben kann, welche ich anschliessend in einer SELECT-Anweisung auswerte etc.. Die Parameter selbst sollen dabei gar nicht zurückgegeben werden. Das hatte ich jetzt nur so gemacht, damit ich überhaupt ein Returnvalue hab. Es sollte ursprünglich eine Tabelle zurückgegeben werden. Die Parameter sind also zwingend notwendig, denn einen einen selbstdef. Returnvalue gibt es nicht. Zumindest nicht dann, wenn ich am Ziel meiner Träume bin ;).

          Gruß,
          Jan

          1. Hallo JCB

            Das hatte ich jetzt nur so gemacht, damit ich überhaupt ein Returnvalue hab.

            Wozu brauchst Du den überhaupt? Lass Dich doch nicht von Deiner Entwicklungsumgebung irritieren.

            Es sollte ursprünglich eine Tabelle zurückgegeben werden. Die Parameter sind also zwingend notwendig, denn einen einen selbstdef. Returnvalue gibt es nicht.

            Warum verwendest Du für so etwas nicht den Query Analyzer?

            Freundliche Grüße

            Vinzenz

            1. Hi Vinzenz!

              Wozu brauchst Du den überhaupt? Lass Dich doch nicht von Deiner Entwicklungsumgebung irritieren.

              Den könnte ich in diesem Fall auch weglassen. Es soll ja aber nachher auch ein Returnvalue (Tabelle) vorhanden sein, deshalb hab ichs dringelassen.

              Warum verwendest Du für so etwas nicht den Query Analyzer?

              Hm, sagt mir jetzt nichts. Wo find ich den denn oder ist das ne eigenständige Software, die inst. werden muß? Aber eigentlich sollte man für 3 Zeilen Code keinen Analyzer brauchen oder ;)?

              Gruß,
              Jan

              1. Hi Jan,

                Den könnte ich in diesem Fall auch weglassen. Es soll ja aber nachher auch ein Returnvalue (Tabelle) vorhanden sein, deshalb hab ichs dringelassen.

                Dann wuerde ich statt dem ganzen Return trara einfach ein
                SELECT 123
                verwenden, ohne Return @test. Dann kriegst Du 123 ausgeworfen.

                Query Analyzer kommt mit Deiner SQL Server Installation, entweder under Tools > Query Analyzer, oder ueber Start>Programme>SQL Server>Query Analyzer.

                Melanie

                1. Hi Melanie!

                  Dann wuerde ich statt dem ganzen Return trara einfach ein
                  SELECT 123
                  verwenden, ohne Return @test. Dann kriegst Du 123 ausgeworfen.

                  *g*, ja ok. Aber im Endeffekt hilft mir das auch nicht weiter. Naja, ich hab mir jetzt so beholfen, in dem ich mir eine 2 Prozedur geschrieben hab, die die andere ausführt. Da gehts komischer weise. Vielleicht für ich ja irgendwann mal den Wurm, der da drinsteckt. Danke trotzdem für die Hilfe!!

                  Gruß,
                  Jan

  3. Hi,

    Alter|Creat Procedure QM_Test_100
    (
      @test int
    )
    AS

    -- -> das deklariert eine _EINGABE_ Variable @test vom Typ Integer

    SELECT @test=123

    -- -> dies ist eine einfache Wertzuweisung, die zu _keiner_ Ausgabe führt

    return @test

    -- -> dies setzt den Return-Value mit dem Inhalt der Variable @test, du gibst in deinem Fall also 123 als Returnwert zurück.

    Du solltest konkreter sein in deiner Formulierung _was nicht funktioniert_. Für die Analyse deines Problems wäre auf jeden Fall der Code, mit dem du auf die SP zugreifst ungemein wichtig. Mit anderen Worten: Was willst du (von der SP)?

    Ciao, Frank