Simple Stored Procedure funktioniert mal und mal nicht
JCB
- datenbank
0 Vinzenz Mai0 JCB
0 MelanieK0 Frank (no reg)
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).
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
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
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
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
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
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
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
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
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
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
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