2010-04-05 4 views
8

Könnte jemand genau dort zeigen, wo MSDN sagt, dass jeder Benutzer gespeicherte Prozedur standardmäßig 0 zurückgibt, wenn kein Fehler auftritt? Mit anderen Worten, konnte ich sicher sein, dass Beispielcode unten, wenn eine gespeicherte ProzedurMSDN über gespeicherte Standard Rückgabewert

IF someStatement 
BEGIN 
    RETURN 1 
END 

sollte immer zurückkehren Null ist, wenn someStatement falsch ist und kein Fehler auftritt?

Ich weiß, dass es tatsächlich so funktioniert, aber ich habe keine explizite Aussage dazu von Microsoft gefunden.

Antwort

7

Es sieht so aus, als hätte der Rückgabewert vor SQL Server 2000 etwas bedeuten können (siehe Referenz von SQL 2000 BOL return value article). Ich habe überprüft, ob ich eine Auflistung dieser ursprünglichen Rückgabe finden könnte Codes speziell für MS SQL, und fand die following (ich weiß nicht, seine Authentizität obwohl, und es tatsächlich nicht die Werte auflisten).

Also nach dem Lesen aller dieser Artikel sieht es aus wie @return_status ist ein Parameter, der IMMER zurückgegeben wird, wenn eine gespeicherte Prozedur ausgeführt wird (auch wenn Sie nicht verwenden). Laut dem Online-Artikel RETURN kann der Rückgabecode NICHT null sein.

Bei Verwendung mit einer gespeicherten Prozedur kann RETURN keinen Nullwert zurückgeben. Wenn eine Prozedur versucht, einen Null-Wert zurückgeben (z. B. mit RETURN @status, wenn @Status ist NULL), wird eine Warnmeldung generiert und Wert von 0 zurückgegeben.

Ausführen des folgenden T-SQL dies auf jeden Fall zeigt,

create Procedure Test 
as 
begin 
DECLARE @RTN integer 
Return @RTN 
END 
GO 

Exec Test 
GO 

Drop Procedure Test 
GO 

Sie erhalten werden

The 'Test' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead. 

am Ende ist es wie die Antwort aussieht, weil @return_status nicht null sein kann (wobei 0, wenn nicht gesetzt ist, oder auf NULL) ...

Was die erro r genannten Codes in der vermeintlichen BOL article für SQL 7.0, wäre meine Vermutung eine alte sein von Sybase halten über ... Sybase 5.0 Manual

Kris

+0

Ihre SQL 7 Link OK aussieht. Es gibt Kopien von BOL, die um das elektrische Interweb verteilt sind, die gelegentlich hier auftauchen, aber in diesem Fall trägt es gut bei. – gbn

0

Wenn Sie einige Logik in Ihrem Client ändern, warum nicht "0" zurückgeben und es expliziter machen?

+3

Warum explizit zurückgeben „0“, wenn sichergestellt ist, zurückgegeben werden? Das ist alles, der Punkt meiner Frage - ist es wirklich garantiert (durch eine Norm, die SQL Server in Anspruch genommen wird, mit zu erfüllen, zum Beispiel), oder dieses Verhalten ist nur optional oder darüber hinaus zu einem gewissen Grad sogar gelegentlich? – Ilya

6

RETURN on MSDN

Edit:

Der Link sagt

Wenn sie mit einer gespeicherten Prozedur verwendet, RETURN nicht einen Nullwert zurückgeben kann. Wenn versucht, ein Verfahren, um einen Null-Wert zurückzukehren (beispielsweise unter Verwendung von RETURN @status wenn @status NULL ist), eine Warnmeldung erzeugt und ein Wert von 0 zurückgegeben.

Man könnte sagen, dass kein RETURN = RETURN NULL = RETURN 0. Aber keine Warnung ausgegeben, weil Sie nicht RETURN NULL ausgeführt haben. Und Null wird erwartet, weil es eine gespeicherte Prozedur ist.

Auch gespeicherte Prozedur Ausführung ermöglicht

EXEC @rtn = uspMyProc @p1... 

So etwas zurückgeschickt werden muss, weil wir immer einen Wert erwarten, nie NULL

I auf Null zurückgegeben 12 Jahren verlassen haben, auch wenn MSDN es nicht sagt. Sowie viele mehr von uns :-)

+0

Das ist alles, der Trick, dass ich durch diesen Artikel sehe immer wieder und kann keine konkrete, präzise Aussage über gespeicherte Prozedur Standardrückgabewert finden. Die einzige, die ich ein wenig relevant fand, ist unten: "Wenn nicht anders dokumentiert, geben alle gespeicherten Prozeduren einen Wert von 0 zurück. Dies zeigt Erfolg an und ein Wert ungleich Null zeigt einen Fehler an" Aber das ist über gespeicherte Prozeduren, nicht Benutzer definiert. Oder, vielleicht, sollte man in Betracht ziehen, Benutzer sp Call ist ein Aufruf an System sp in erster Linie? Diese Version scheint mir ziemlich unwahrscheinlich. – Ilya

+0

Wie kann ich verstehen, der Artikel, den Sie oben sogar darauf ist nicht gesagt, daß RETURN ohne Argumente ergeben Nullwert zurück. Außerdem alle Beispiele dort aufgeführten keinen Fall von meinem Interesse (erstes Beispiel enthält nicht erklären, was sollte eigentlich zurückgegeben werden, es erklärte nur, dass die Ausführung von sp wird beendet und die andere beschäftigt sich mit nicht-Null-Rückkehr Nur Werte) – Ilya

0
+1

Dieser Artikel enthält keine Informationen zum Standard-Rückgabewert. Die dort verwendeten Beispiele gaben explizit null zurück, um den Erfolg anzuzeigen. – Ilya

+0

es ist für mich hilfreich, weil es die Standardwerte für verschiedene Betriebsarten beschrieben sind, zum Beispiel, wenn gespeicherte Prozedur standardmäßig erfolgreich ist es 0 zurück – Muflix