Aufrufen von gespeicherten ProzedurenCalling a Stored Procedure

Dieses Thema gilt für: JaSQL ServerJaAzure SQL-DatenbankJaAzure SQL Data Warehouse Ja Parallel DatawarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Die SQL ServerSQL Server Native Client ODBC-Treiber unterstützt sowohl die ODBC CALL-Escapesequenz und die Transact-SQLTransact-SQL EXECUTE Anweisung zum Ausführen von gespeicherten Prozeduren, die ODBC CALL-Escapesequenz ist die bevorzugte Methode.The SQL ServerSQL Server Native Client ODBC driver supports both the ODBC CALL escape sequence and the Transact-SQLTransact-SQLEXECUTE statement for executing stored procedures; the ODBC CALL escape sequence is the preferred method. Mithilfe der ODBC-Syntax kann eine Anwendung die Rückgabecodes von gespeicherten Prozeduren abrufen. Zudem wurde der SQL ServerSQL Server Native Client ODBC-Treiber für die Verwendung eines ursprünglich zum Senden von Remoteprozeduraufrufen (RPC) zwischen Computern, die SQL ServerSQL Server ausführen, entwickelten Protokolls optimiert.Using ODBC syntax enables an application to retrieve the return codes of stored procedures and the SQL ServerSQL Server Native Client ODBC driver is also optimized to use a protocol originally developed for sending remote procedure (RPC) calls between computers running SQL ServerSQL Server. Dieses RPC-Protokoll erhöht die Leistung, indem es einen Großteil der Parameterverarbeitung und Anweisungsauswertung auf dem Server überflüssig macht.This RPC protocol increases performance by eliminating much of the parameter processing and statement parsing done on the server.

Hinweis

Beim Aufrufen von SQL ServerSQL Server gespeicherte Prozeduren, die benannte Parameter verwenden, mit dem ODBC (Weitere Informationen finden Sie unter Bindungsparameter von Namen (Parameter genannt)), müssen die Parameternamen beginnen, mit der "@" Zeichen.</span><span class="sxs-lookup">When calling SQL ServerSQL Server stored procedures using named parameters with ODBC (for more information, see Binding Parameters by Name (Named Parameters)), the parameter names must start with the '@' character. Dies ist eine SQL ServerSQL Server-spezifische Einschränkung.This is a SQL ServerSQL Server specific restriction. Der SQL ServerSQL Server Native Client ODCB-Treiber erzwingt diese Einschränkung strenger als die MDAC (Microsoft Data Access Components).The SQL ServerSQL Server Native Client ODBC driver enforces this restriction more strictly than the Microsoft Data Access Components (MDAC).

Die ODBC CALL-Escapesequenz für das Aufrufen einer Prozedur lautet wie folgt:The ODBC CALL escape sequence for calling a procedure is:

{[? =]AufrufenProcedure_name[([Parameter] [,[Parameter]] ...)]}{[?=]callprocedure_name[([parameter][,[parameter]]...)]}

wobei Procedure_name gibt den Namen einer Prozedur und Parameter gibt einen Prozedurparameter an.where procedure_name specifies the name of a procedure and parameter specifies a procedure parameter. Benannte Parameter werden nur in Anweisungen mit ODBC CALL-Escapesequenz unterstützt.Named parameters are only supported in statements using the ODBC CALL escape sequence.

Eine Prozedur kann 0 (null) oder mehr Parameter haben.A procedure can have zero or more parameters. Sie kann außerdem einen Wert zurückgeben (wie durch die optionale Parametermarkierung ?= am Anfang der Markierung angegeben).It can also return a value (as indicated by the optional parameter marker ?= at the start of the syntax). Wenn es sich bei einem Parameter um einen Eingabe- oder einen Eingabe-/Ausgabeparameter handelt, kann ein Literalwert oder eine Parametermarkierung verwendet werden.If a parameter is an input or an input/output parameter, it can be a literal or a parameter marker. Wenn es sich bei dem Parameter um einen Ausgabeparameter handelt, muss eine Parametermarkierung verwendet werden, da die Ausgabe unbekannt ist.If the parameter is an output parameter, it must be a parameter marker because the output is unknown. Müssen gebundene parametermarkierungen mit SQLBindParameter vor dem Aufruf der Prozedur-Anweisung ausgeführt wird.Parameter markers must be bound with SQLBindParameter before the procedure call statement is executed.

Eingabe- und Eingabe-/Ausgabeparameter müssen in Prozeduraufrufen nicht angegeben werden.Input and input/output parameters can be omitted from procedure calls. Wenn eine Prozedur mit Klammern aber ohne Parameter aufgerufen wird, weist der Treiber die Datenquelle an, für den ersten Parameter den Standardwert zu verwenden.If a procedure is called with parentheses but without any parameters, the driver instructs the data source to use the default value for the first parameter. Beispiel:For example:

{Aufrufen Procedure_name()}{call procedure_name( )}

Wenn die Prozedur keine Parameter aufweist, kann bei der Prozedur ein Fehler auftreten.If the procedure does not have any parameters, the procedure can fail. Wenn eine Prozedur ohne Klammern aufgerufen wird, sendet der Treiber keine Parameterwerte.If a procedure is called without parentheses, the driver does not send any parameter values. Beispiel:For example:

{Aufrufen Procedure_name}{call procedure_name}

Literalwerte können in Prozeduraufrufen für Eingabe- und Eingabe-/Ausgabeparameter angegeben werden.Literals can be specified for input and input/output parameters in procedure calls. Die Prozedur InsertOrder weist beispielsweise fünf Parameter auf.For example, the procedure InsertOrder has five input parameters. Beim folgenden Aufruf von InsertOrder ist der erste Parameter nicht angegeben, für den zweiten Parameter ist ein Literalwert angegeben und für den dritten, vierten und fünften Parameter wird eine Parametermarkierung verwendet.The following call to InsertOrder omits the first parameter, provides a literal for the second parameter, and uses a parameter marker for the third, fourth, and fifth parameters. (Parameter werden sequenziell nummeriert und beginnen mit dem Wert 1.)(Parameters are numbered sequentially, beginning with a value of 1.)

{call InsertOrder(, 10, ?, ?, ?)}  

Wenn ein Parameter nicht angegeben wird, muss das Komma dennoch gesetzt werden, damit dieser Parameter von anderen Parametern abgegrenzt wird.Note that if a parameter is omitted, the comma delimiting it from other parameters must still appear. Wenn ein Eingabe- oder ein Eingabe-/Ausgabeparameter ausgelassen wird, verwendet die Prozedur den Standardwert des Parameters.If an input or input/output parameter is omitted, the procedure uses the default value of the parameter. Eine weitere Möglichkeit, den Standardwert eines Eingabe- oder eines Eingabe-/Ausgabeparameters anzugeben, besteht darin, den Wert des an den Parameter gebundenen Längen-/Indikatorpuffers auf SQL_DEFAULT_PARAM festzulegen oder das DEFAULT-Schlüsselwort zu verwenden.Other ways to specify the default value of an input or input/output parameter are to set the value of the length/indicator buffer bound to the parameter to SQL_DEFAULT_PARAM, or to use the DEFAULT keyword.

Wenn ein Eingabe-/Ausgabeparameter ausgelassen oder ein Literalwert für den Parameter angegeben wird, verwirft der Treiber den Ausgabewert.If an input/output parameter is omitted, or if a literal is supplied for the parameter, the driver discards the output value. Entsprechend verwirft der Treiber den Rückgabewert, wenn die Parametermarkierung für den Rückgabewert einer Prozedur ausgelassen wird.Similarly, if the parameter marker for the return value of a procedure is omitted, the driver discards the return value. Wenn eine Anwendung den Parameter des Rückgabewerts für eine Prozedur angibt, die keinen Wert zurückgibt, legt der Treiber den Wert des an den Parameter gebundenen Längen-/Indikatorpuffers auf SQL_NULL_DATA fest.Finally, if an application specifies a return value parameter for a procedure that does not return a value, the driver sets the value of the length/indicator buffer bound to the parameter to SQL_NULL_DATA.

Trennzeichen in CALL-AnweisungenDelimiters in CALL Statements

Der SQL ServerSQL Server Native Client ODBC-Treiber unterstützt außerdem standardmäßig eine für die ODBC { CALL }-Escapesequenz spezifische Kompatibilitätsoption.The SQL ServerSQL Server Native Client ODBC driver by default also supports a compatibility option specific to the ODBC { CALL } escape sequence. Der Treiber akzeptiert nur CALL-Anweisungen mit einem Satz doppelter Anführungszeichen zum Trennen des gesamten Namens der gespeicherten Prozedur:The driver accepts CALL statements with only a single set of double quotation marks delimiting the entire stored procedure name:

{ CALL "master.dbo.sp_who" }  

Der SQL ServerSQL Server Native Client ODBC-Treiber akzeptiert darüber hinaus auch standardmäßig CALL-Anweisungen, die den ISO-Regeln gehorchen und bei denen jeder Bezeichner in doppelten Anführungszeichen steht:By default the SQL ServerSQL Server Native Client ODBC driver also accepts CALL statements that follow the ISO rules and enclose each identifier in double quotation marks:

{ CALL "master"."dbo"."sp_who" }  

Beim Ausführen der Standardeinstellungen unterstützt der SQL ServerSQL Server Native Client ODBC-Treiber bei Bezeichnern mit Zeichen, die durch den ISO-Standard nicht als gültige Zeichen in Bezeichnern angegeben sind, jedoch keine Form von Bezeichnern mit Anführungszeichen.When running with the default settings, however, the SQL ServerSQL Server Native Client ODBC driver does not support using either form of quoted identifier with identifiers that contain characters not specified as legal in identifiers by the ISO standard. Z. B. der Treiber kann nicht den Zugriff auf eine gespeicherte Prozedur namens "My.Proc" mit einer CALL-Anweisung mit Bezeichnern:For example, the driver cannot access a stored procedure named "My.Proc" using a CALL statement with quoted identifiers:

{ CALL "MyDB"."MyOwner"."My.Proc" }  

Diese Anweisung wird vom Treiber wie folgt interpretiert:This statement is interpreted by the driver as:

{ CALL MyDB.MyOwner.My.Proc }  

Der Server löst einen Fehler, der ein Verbindungsserver mit dem Namen MyDB ist nicht vorhanden.The server raises an error that a linked server named MyDB does not exist.

Das Problem tritt nicht auf, wenn Bezeichner in Klammern verwendet werden. Dann wird diese Anweisung richtig interpretiert:The issue does not exist when using bracketed identifiers, this statement is interpreted correctly:

{ CALL [MyDB].[MyOwner].[My.Table] }  

Weitere Informationen finden Sie unterSee Also

Ausführen gespeicherter ProzedurenRunning Stored Procedures