Was kann den SQL Server-JDBC-Fehler verursachen? 'Der Wert ist nicht für die Parameternummer 0' für einen Ausgangsparameterzugriff gesetzt?

8

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:

  • SQL Server-JDBC-Treiber 1.2
  • SQL Server 2005 (64-Bit) Service Pack 2
  • SQL Server 2005 (64-Bit) Service Pack 3

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 ...

    
Matthew Murdoch 15.05.2009, 08:22
quelle

5 Antworten

0

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.

    
DForck42 13.05.2009 15:37
quelle
0

Registrierst du die Ausgabeparameter? Laut den Dokumenten "Alle OUT-Parameter müssen registriert werden, bevor eine gespeicherte Prozedur ausgeführt wird. "

    
Vincent Ramdhanie 13.05.2009 15:41
quelle
0

Es gibt ein paar Dinge, die einem einfallen:

  1. Sie haben kein RETURN x (wobei x ein INT ist, das das Ergebnis der Verarbeitung darstellt, 0 = Erfolg, alles andere stellt eine Warnung oder einen Fehler dar).
  2. Ihr Client-Code weist zusätzlich zu Ihrem Ausgabeparameter keinen Parameter für den Rückgabewert zu.

Hoffe, das hilft,

Rechnung

    
V'rasana Oannes 23.05.2009 06:53
quelle
0
  

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.

    
Nick.McDermaid 22.09.2014 00:22
quelle
0

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.

    
ChrisR 25.04.2016 13:59
quelle