SQLDescribeParam
Um die Parameter einer SQL-Anweisung zu beschreiben, erstellt und führt der SQL Server Native Client ODBC-Treibers eine Transact-SQL SELECT-Anweisung aus, wenn SQLDescribeParam für ein vorbereitetes ODBC-Anweisungshandle aufgerufen wird. Die Metadaten des Resultsets bestimmen die Eigenschaften der Parameter in der vorbereiteten Anweisung. SQLDescribeParam kann jeden Fehlercode zurückgeben, den SQLExecute oder SQLExecDirect möglicherweise zurückgeben.
Verbesserungen in der Datenbank-Engine ab SQL Server 2012 ermöglichen SQLDescribeParam, genauere Beschreibungen der erwarteten Ergebnisse zu erhalten. Diese genaueren Ergebnisse können sich von den Werten unterscheiden, die von SQLDescribeParam in früheren Versionen von SQL Server zurückgegeben wurden. Weitere Informationen finden Sie unter Metadatenermittlung.
Ebenfalls neu in SQL Server 2012 gibt ParameterSizePtr jetzt einen Wert zurück, der an der Definition für die Größe der Spalte oder des Ausdrucks des entsprechenden Parametermarkierrs in Zeichen ausgerichtet ist, wie in der ODBC-Spezifikation definiert. In früheren Versionen von SQL Server Native Client konnte ParameterSizePtr der entsprechende Wert von SQL_DESC_OCTET_LENGTH
für den Typ oder ein irrelevanter Spaltengrößenwert sein, der für SQLBindParameter für einen Typ angegeben wurde, dessen Wert ignoriert werden sollte (SQL_INTEGER
z. B. ).
Der Treiber unterstützt den Aufruf von SQLDescribeParam in den folgenden Situationen nicht:
Nach SQLExecDirect für alle Transact-SQL UPDATE- oder DELETE-Anweisungen, die die FROM-Klausel enthalten.
Für jede ODBC- oder Transact-SQL-Anweisung, die einen Parameter in einer HAVING-Klausel enthält, oder verglichen mit dem Ergebnis einer SUM-Funktion.
Für jede ODBC- oder Transact-SQL-Anweisung abhängig von einer Unterabfrage, die Parameter enthält.
Für ODBC SQL-Anweisungen, die Parametermarkierungen in beiden Ausdrücken eines Vergleichs oder quantifizierten Prädikats enthalten.
Für Abfragen, bei denen einer der Parameter ein Parameter für eine Funktion ist.
Wenn im Transact-SQL-Befehl Kommentare (/* */) vorhanden sind.
Bei der Verarbeitung eines Batches von Transact-SQL-Anweisungen unterstützt der Treiber auch nicht das Aufrufen von SQLDescribeParam für Parametermarker in Anweisungen nach der ersten Anweisung im Batch.
Bei der Beschreibung der Parameter vorbereiteter gespeicherter Prozeduren verwendet SQLDescribeParam die gespeicherte Systemprozedur sp_sproc_columns, um Parametermerkmale abzurufen. sp_sproc_columns können Daten für gespeicherte Prozeduren in der aktuellen Benutzerdatenbank melden. Durch das Vorbereiten eines vollqualifizierten Namens einer gespeicherten Prozedur kann SQLDescribeParam datenbankübergreifend ausgeführt werden. Beispielsweise kann die gespeicherte Systemprozedur sp_who in jeder Datenbank wie folgt vorbereitet und ausgeführt werden:
SQLPrepare(hstmt, "{call sp_who(?)}", SQL_NTS);
Beim Ausführen von SQLDescribeParam nach erfolgreicher Vorbereitung wird ein leerer Zeilensatz zurückgegeben, wenn eine Verbindung mit einer Datenbank außer master
hergestellt wird. Derselbe Aufruf, der wie folgt vorbereitet wird, bewirkt, dass SQLDescribeParam unabhängig von der aktuellen Benutzerdatenbank erfolgreich ist:
SQLPrepare(hstmt, "{call master..sp_who(?)}", SQL_NTS);
Bei Datentypen mit großen Werten ist der in DataTypePtr zurückgegebene Wert SQL_VARCHAR, SQL_VARBINARY oder SQL_NVARCHAR. Um anzugeben, dass die Größe des Datentypparameters für große Werte "unbegrenzt" ist, legt der SQL Server Native Client ODBC-Treiber ParameterSizePtr auf 0 fest. Tatsächliche Größenwerte werden für varchar
-Standardparameter zurückgegeben.
Hinweis
Wenn der Parameter bereits mit einer Maximalgröße für den SQL_VARCHAR-, SQL_VARBINARY- oder SQL_WVARCHAR-Parameter gebunden wurde, wird die gebundene Größe des Parameters und nicht "unbegrenzt" zurückgegeben.
Um einen Eingabeparameter mit "unbegrenzter" Größe zu binden, muss Data-at-Execution verwendet werden. Es ist nicht möglich, einen Ausgabeparameter für "unbegrenzte Größe" zu binden (es gibt keine Methode zum Streamen von Daten aus einem Ausgabeparameter, wie sqlGetData für Resultsets).
Für Ausgabeparameter muss ein Puffer gebunden werden und wenn der Wert zu umfangreich ist, wird der Puffer aufgefüllt und eine SQL_SUCCESS_WITH_INFO-Meldung wird zusammen mit einer Warnung "Zeichenfolgendaten werden rechts abgeschnitten" zurückgegeben. Die abgeschnittenen Daten werden anschließend verworfen.
SQLDescribeParam und Tabellenwertparameter
Eine Anwendung kann Tabellenwertparameterinformationen für eine vorbereitete Anweisung mit SQLDescribeParam abrufen. Weitere Informationen finden Sie unter Tabellenwertparametermetadaten für vorbereitete Anweisungen.
Weitere Informationen zu Tabellenwertparametern im Allgemeinen finden Sie unter Tabellenwertparameter (ODBC).
SQLDescribeParam-Unterstützung für erweiterte Funktionen für Datum und Uhrzeit
Die für Datums-/Uhrzeittypen zurückgegebenen Werte lauten wie folgt:
DataTypePtr | ParameterSizePtr | DecimalDigitsPtr | |
---|---|---|---|
datetime | SQL_TYPE_TIMESTAMP | 23 | 3 |
smalldatetime | SQL_TYPE_TIMESTAMP | 16 | 0 |
date | SQL_TYPE_DATE | 10 | 0 |
time | SQL_SS_TIME2 | 8, 10..16 | 0..7 |
datetime2 | SQL_TYPE_TIMESTAMP | 19, 21..27 | 0..7 |
datetimeoffset | SQL_SS_TIMESTAMPOFFSET | 26, 28..34 | 0..7 |
Weitere Informationen finden Sie unter Verbesserungen an Datum und Uhrzeit (ODBC).
SQLDescribeParam-Unterstützung für große CLR-UDTs
SQLDescribeParam
unterstützt große benutzerdefinierte CLR-Typen (UDTs). Weitere Informationen finden Sie unter Large CLR User-Defined Types (ODBC).