Ich habe Java-Code, der auf SQL Server 2005 zugreift, der ungefähr so aussieht:
%Vor%Und die folgende Ausnahme wird von der letzten Zeile geworfen:
%Vor%Die aufgerufene gespeicherte Prozedur sieht ungefähr so aus:
%Vor%Da der Ausgabeparameter beim Eintritt in die gespeicherte Prozedur auf Null gesetzt wird, unter welchen Umständen könnte der Wert nicht gesetzt werden? Oder interpretiere ich die Fehlermeldung falsch?
Dieser Fehler ist reproduzierbar mit:
Update: Es scheint als Folge des -- Do processing...
-Teils der gespeicherten Prozedur aufgetreten zu sein. Durch das Entfernen wird der Fehler behoben. Es gibt zu viel Code, um hier zu reproduzieren, was ich möchte, ist ein paar Hinweise auf mögliche Ursachen, um mögliche Kandidaten einzuschränken.
Update: Das Eingeben von Fehlern (z. B. Division durch Null) in den -- Do processing...
-Teil der gespeicherten Prozedur bewirkt nicht, dass diese Ausnahme ausgelöst wird (stattdessen wie erwartet) , der Aufruf execute()
schlägt mit einer entsprechenden Fehlermeldung fehl.
Update: Das Dekompilieren der Klasse com.microsoft.sqlserver.jdbc.SQLServerCallableStatement legt nahe, dass 'Parameternummer 0' die gespeicherte Prozedur Rückgabewert ist.
Update: Ich konnte dies nicht reproduzieren, indem ich die gespeicherte Prozedur direkt über Management Studio aufruft.
Update: Die ultimative Ursache für diesen Fehler scheint ein Deadlock in der gespeicherten Prozedur zu sein. In der Regel führen Deadlocks jedoch dazu, dass der execute()
-Aufruf fehlschlägt, wenn ein SQLException
den SQL Server-Fehlercode 1205 umschließt ...
bei Ihren Parametern, deklarieren Sie sie einfach oder setzen Sie sie auf einen Standardwert? versuche, sie auf einen Standardwert von null oder etwas zu setzen und zu sehen, ob du immer noch den Fehler bekommst.
sql server mag es nicht, wenn ein Parameter nicht auf einen Standardwert gesetzt ist und Sie ihm beim Ausführen der gespeicherten Prozedur keinen Wert übergeben.
Registrierst du die Ausgabeparameter? Laut den Dokumenten "Alle OUT-Parameter müssen registriert werden, bevor eine gespeicherte Prozedur ausgeführt wird. "
Es gibt ein paar Dinge, die einem einfallen:
Hoffe, das hilft,
Rechnung
Dekompilieren der com.microsoft.sqlserver.jdbc.SQLServerCallableStatement-Klasse schlägt vor Diese 'Parameternummer 0' ist der Rückgabewert der gespeicherten Prozedur.
Das ist richtig. Wenn Ihre gespeicherte Prozedurdefinition 11 Eingabe- / Ausgabeparameter hat, müssen Sie 12 in Ihrem aufrufenden Code wirklich definieren. Parameter 0 ist der Rückkehrcode.
Zum Beispiel mit einem SP mit einem Eingang und einem Ausgangsparameter, in SSMS führen Sie dies aus:
%Vor%Sie haben hier eigentlich drei Parameter, nicht zwei.
Falls jemand dieses Problem noch auf dem SQL Server 2008 hat.
Ich hatte das gleiche Problem bei einer Update-Anweisung mit dem Versuch, einen Timestamp für ein DateTime-Feld zu setzen. Das beanstandete Feld befand sich in einer where-Klausel bei einem anderen Index als der gemeldete.
Tags und Links sql-server stored-procedures jdbc