SQLDescribeParam
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Um die Parameter einer SQL-Anweisung zu beschreiben, erstellt der ODBC-Treiber von SQL Server Native Client und führt 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 kann.
Verbesserungen des Datenbankmoduls ab SQL Server 2012 (11.x) ermöglichen SQLDescribeParam, genauere Beschreibungen der erwarteten Ergebnisse zu erhalten. Diese genaueren Ergebnisse können sich von den von SQLDescribeParam in früheren Versionen von SQL Server zurückgegebenen Werten unterscheiden. Weitere Informationen finden Sie unter Metadatenermittlung.
Auch neu in SQL Server 2012 (11.x), ParameterSizePtr gibt jetzt einen Wert zurück, der an der Definition für die Größe der Spalte oder des Ausdrucks der entsprechenden Parametermarkierung gemäß definition in der ODBC-Spezifikation ausgerichtet ist. In früheren Versionen von SQL Server Native Client könnte 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 bereitgestellt wurde, dessen Wert ignoriert werden soll (z. B. SQL_INTEGER).
Der Treiber unterstützt das Aufrufen von SQLDescribeParam in den folgenden Situationen nicht:
After SQLExecDirect for any Transact-SQL UPDATE or DELETE statements containing the FROM clause.
Für jede ODBC- oder Transact-SQL-Anweisung, die einen Parameter in einer HAVING-Klausel enthält oder mit dem Ergebnis einer SUMME-Funktion verglichen wird.
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 das Aufrufen von SQLDescribeParam für Parametermarkierungen in Anweisungen nach der ersten Anweisung im Batch nicht.
Beim Beschreiben der Parameter vorbereiteter gespeicherter Prozeduren verwendet SQLDescribeParam die gespeicherte Systemprozedur sp_sproc_columns zum Abrufen von Parametermerkmalen. sp_sproc_columns können Daten für gespeicherte Prozeduren in der aktuellen Benutzerdatenbank melden. Durch das Vorbereiten eines vollqualifizierten Namens für gespeicherte Prozeduren kann SQLDescribeParam über Datenbanken hinweg ausgeführt werden. Beispielsweise kann die vom System gespeicherte Prozedur sp_who in jeder Datenbank vorbereitet und ausgeführt werden als:
SQLPrepare(hstmt, "{call sp_who(?)}", SQL_NTS);
Das Ausführen von SQLDescribeParam nach erfolgreicher Vorbereitung gibt einen leeren Zeilensatz zurück, wenn eine Verbindung mit einer Datenbank, aber einem Master-Shape 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 ODBC-Treiber von SQL Server Native Client ParameterSizePtr auf 0 fest. Ist-Größenwerte werden für standard varchar-Parameter 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 "unbegrenzten" Größenausgabeparameter 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 Parametern mit Tabellenwerten im Allgemeinen finden Sie unter "Table-Valued Parameters (ODBC)".
SQLDescribeParam-Unterstützung für erweiterte Funktionen für Datum und Uhrzeit
Die für Datums-/Uhrzeittypen zurückgegebenen Werte lauten wie folgt:
Attribut | 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 "Datums- und Uhrzeitverbesserungen (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)".