SQLSpecialColumns-Funktion

Konformität
Eingeführte Version: ODBC 1.0 Standards Compliance: Open Group

Summary
SQLSpecialColumns ruft folgende Informationen über Spalten innerhalb einer festgelegten Tabelle ab:

  • Die optimale Menge von Spalten, die eindeutig eine Zeile in der Tabelle identifiziert.

  • Spalten, die automatisch aktualisiert werden, wenn ein Wert in der Zeile durch eine Transaktion aktualisiert wird.

Syntax

  
SQLRETURN SQLSpecialColumns(  
     SQLHSTMT      StatementHandle,  
     SQLSMALLINT   IdentifierType,  
     SQLCHAR *     CatalogName,  
     SQLSMALLINT   NameLength1,  
     SQLCHAR *     SchemaName,  
     SQLSMALLINT   NameLength2,  
     SQLCHAR *     TableName,  
     SQLSMALLINT   NameLength3,  
     SQLSMALLINT   Scope,  
     SQLSMALLINT   Nullable);  

Argumente

StatementHandle
[Eingabe] Anweisungshandle.

IdentifierType
[Eingabe] Art der Spalte, die zurückgegeben werden soll. Dies muss einer der folgenden Werte sein:

SQL_BEST_ROWID: Gibt die optimale Spalte oder Spaltenmenge zurück, die durch das Abrufen von Werten aus der Spalte oder den Spalten jede Zeile in der angegebenen Tabelle eindeutig identifizieren lässt. Eine Spalte kann entweder eine speziell für diesen Zweck entwickelte Pseudo-Spalte sein (wie in Oracle ROWID oder Ingres TID) oder die Spalte oder mehrere Spalten eines eindeutigen Index für die Tabelle.

SQL_ROWVER: Gibt die Spalte oder Spalten in der angegebenen Tabelle, falls vorhanden, zurück, die automatisch von der Datenquelle aktualisiert werden, wenn ein Wert in der Zeile durch eine Transaktion aktualisiert wird (wie bei SQLBase ROWID oder Sybase TIMESTAMP).

Catalogname
[Eingabe] Katalogname für die Tabelle. Wenn ein Treiber Kataloge für einige Tabellen, aber nicht für andere unterstützt, etwa wenn der Treiber Daten aus verschiedenen DBMSs abruft, bezeichnet eine leere Zeichenkette ("") jene Tabellen, die keine Kataloge besitzen. CatalogName kann kein String-Suchmuster enthalten.

Wenn das Attribut SQL_ATTR_METADATA_ID Statement auf SQL_TRUE gesetzt ist, wird CatalogName als Identifikator behandelt und sein Fall ist nicht signifikant. Wenn es SQL_FALSE ist, ist CatalogName ein gewöhnliches Argument; Es wird wörtlich behandelt, und sein Fall ist bedeutsam. Weitere Informationen finden Sie unter Argumente in Katalogfunktionen.

NameLength1
[Eingabe] Länge in den Zeichen von *CatalogName.

SchemaName
[Eingabe] Schema-Name für die Tabelle. Wenn ein Treiber Schemata für einige Tabellen, aber für andere nicht unterstützt, etwa wenn der Treiber Daten aus verschiedenen DBMSs abruft, bezeichnet eine leere Zeichenkette ("") jene Tabellen, die keine Schemata enthalten. SchemaName kann kein Zeichenkettensuchmuster enthalten.

Wenn das Attribut SQL_ATTR_METADATA_ID Statement auf SQL_TRUE gesetzt ist, wird SchemaName als Identifikator behandelt und sein Fall ist nicht signifikant. Wenn es SQL_FALSE ist, ist SchemaName ein gewöhnliches Argument; Es wird wörtlich behandelt, und sein Fall ist bedeutsam.

NameLength2
[Eingabe] Länge in den Zeichen von *SchemaName.

Tabellenname
[Eingabe] Tabellenname. Dieses Argument kann kein Nullpointer sein. TableName kann kein Zeichenkettensuchmuster enthalten.

Wenn das Attribut SQL_ATTR_METADATA_ID Statement auf SQL_TRUE gesetzt ist, wird TableName als Identifikator behandelt und sein Fall ist nicht signifikant. Wenn es SQL_FALSE ist, ist TableName ein gewöhnliches Argument; Es wird wörtlich behandelt, und sein Fall ist bedeutsam.

NameLength3
[Eingabe] Länge in den Zeichen von *TableName.

Scope
[Eingabe] Mindestmaßnahme des Rowid. Das zurückgekommene Rowid könnte von größerem Umfang sein. Muss einer der folgenden Werte sein:

SQL_SCOPE_CURROW: Der Rowid ist garantiert nur gültig, solange er auf dieser Reihe steht. Eine spätere Neuauswahl mit Rowid kann eine Zeile nicht zurückgeben, wenn die Zeile durch eine andere Transaktion aktualisiert oder gelöscht wurde.

SQL_SCOPE_TRANSACTION: Das Rowid ist garantiert für die Dauer der aktuellen Transaktion gültig.

SQL_SCOPE_SESSION: Der Rowid ist für die Dauer der Sitzung (über Transaktionsgrenzen hinweg) garantiert gültig.

Nullable
[Eingabe] Bestimmt, ob spezielle Spalten zurückgegeben werden sollen, die einen NULL-Wert haben können. Muss einer der folgenden Werte sein:

SQL_NO_NULLS: Spezielle Spalten ausschließen, die NULL-Werte haben können. Einige Treiber können SQL_NO_NULLS nicht unterstützen und geben ein leeres Ergebnisset zurück, wenn SQL_NO_NULLS angegeben wurde. Bewerbungen sollten für diesen Fall vorbereitet werden und SQL_NO_NULLS nur dann beantragen, wenn es absolut erforderlich ist.

SQL_NULLABLE: Spezielle Spalten zurückgeben, selbst wenn sie NULL-Werte haben können.

Rücklieferungen

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR oder SQL_INVALID_HANDLE.

Diagnostics

Wenn SQLSpecialColumns SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugehöriger SQLSTATE-Wert erhalten werden, indem SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle von StatementHandle aufgerufen wird. Die folgende Tabelle listet die von SQLSpecialColumns häufig zurückgegebenen SQLSTATE-Werte auf und erklärt jeden einzelnen im Kontext dieser Funktion; die Notation "(DM)" geht den vom Treibermanager zurückgegebenen SQLSTATE-Beschreibungen voraus. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Fehler Description
01000 Allgemeiner Warnhinweis Treiberspezifische Informationsmeldung. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
08S01 Kommunikationslinkfehler Die Kommunikationsverbindung zwischen dem Treiber und der Datenquelle, mit der der Treiber verbunden wurde, ist fehlgeschlagen, bevor die Verarbeitung der Funktion abgeschlossen wurde.
24000 Ungültiger Cursorstatus Ein Cursor war auf dem StatementHandle geöffnet, und SQLFetch oder SQLFetchScroll war aufgerufen worden. Dieser Fehler wird vom Treibermanager zurückgegeben, wenn SQLFetch oder SQLFetchScroll SQL_NO_DATA nicht zurückgegeben hat, und vom Treiber zurückgegeben, wenn SQLFetch oder SQLFetchScroll SQL_NO_DATA zurückgegeben hat.

Ein Cursor war auf dem StatementHandle geöffnet, aber SQLFetch oder SQLFetchScroll waren nicht aufgerufen worden.
40001 Serialisierungsfehler Die Transaktion wurde aufgrund eines Ressourcen-Deadlocks mit einer anderen Transaktion zurückgesetzt.
40003 Abschluss der Anweisung unbekannt Fehler bei der zugehörigen Verbindung während der Ausführung dieser Funktion, und der Status der Transaktion kann nicht bestimmt werden.
HY000 Allgemeiner Fehler Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagRec im *MessageText-Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und dessen Ursache.
HY001 Speicherzuweisungsfehler Der Treiber konnte speicher nicht zuordnen, der erforderlich ist, um die Ausführung oder den Abschluss der Funktion zu unterstützen.
HY008 Vorgang abgebrochen Die asynchrone Verarbeitung wurde für " StatementHandle" aktiviert. Die Funktion wurde aufgerufen, und bevor sie die Ausführung abgeschlossen hat, wurde SQLCancel oder SQLCancelHandle für die Anweisungshandle aufgerufen. Anschließend wurde die Funktion erneut für " StatementHandle" aufgerufen.

Die Funktion wurde aufgerufen, und bevor sie die Ausführung abgeschlossen hat, wurde SQLCancel oder SQLCancelHandle für das StatementHandle von einem anderen Thread in einer Multithreadanwendung aufgerufen.
HY009 Ungültige Verwendung des Nullzeigers Das Argument "TableName" war ein Nullzeiger.

Das Attribut SQL_ATTR_METADATA_ID Statement wurde auf SQL_TRUE gesetzt, das CatalogName-Argument war ein Nullzeiger, und der SQL_CATALOG_NAME InfoType gibt an, dass Katalognamen unterstützt werden.

(DM) Das Attribut SQL_ATTR_METADATA_ID-Anweisung wurde auf SQL_TRUE gesetzt, und das SchemaName-Argument war ein Nullzeiger.
HY010 Funktionssequenzfehler (DM) Eine asynchron ausgeführte Funktion wurde für den Verbindungshandle aufgerufen, der dem StatementHandle zugeordnet ist. Diese Funktion lief noch, als SQLSpecialColumns aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect oder SQLMoreResults wurde für " StatementHandle " aufgerufen und SQL_PARAM_DATA_AVAILABLE zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle gestreamten Parameter abgerufen wurden.

(DM) Eine asynchron ausgeführte Funktion (nicht diese) wurde für das StatementHandle aufgerufen und wurde noch ausgeführt, als diese Funktion aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos wurde für " StatementHandle " aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle Daten bei ausführungsparametern oder -spalten gesendet wurden.
HY013 Speicherverwaltungsfehler Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer Arbeitsspeicherbedingungen.
HY090 Ungültige Zeichenfolgen- oder Pufferlänge (DM) Der Wert eines der Längenargumente war weniger als 0, aber nicht gleich SQL_NTS.

Der Wert eines der Längenargumente überschritt den maximalen Längenwert für den entsprechenden Namen. Die maximale Länge jedes Namens kann durch das Aufrufen von SQLGetInfo mit den InfoType-Werten SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN oder SQL_MAX_TABLE_NAME_LEN berechnet werden.
HY097 Säulentyp außerhalb der Reichweite (DM) Ein ungültiger IdentifierType-Wert wurde angegeben.
HY098 Zielfernrohrtyp außerhalb der Reichweite (DM) Ein ungültiger Scope-Wert wurde angegeben.
HY099 Nullierbarer Typ außerhalb der Reichweite (DM) Ein ungültiger Nullable-Wert wurde angegeben.
HY117 Die Verbindung wird aufgrund des unbekannten Transaktionsstatus angehalten. Es sind nur Trenn- und schreibgeschützte Funktionen zulässig. (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran Function.
HYC00 Optionales Feature wurde nicht implementiert Ein Katalog wurde angegeben, und der Treiber oder die Datenquelle unterstützt keine Kataloge.

Ein Schema wurde festgelegt, und der Treiber oder die Datenquelle unterstützt keine Schemata.

Die Kombination der aktuellen Einstellungen der SQL_ATTR_CONCURRENCY- und SQL_ATTR_CURSOR_TYPE-Anweisungsattribute wurde vom Treiber oder der Datenquelle nicht unterstützt.

Das attribut der SQL_ATTR_USE_BOOKMARKS-Anweisung wurde auf SQL_UB_VARIABLE festgelegt, und das Attribut der SQL_ATTR_CURSOR_TYPE-Anweisung wurde auf einen Cursortyp festgelegt, für den der Treiber keine Lesezeichen unterstützt.
HYT00 Timeout überschritten Der Abfragetimeoutzeitraum ist abgelaufen, bevor die Datenquelle das angeforderte Resultset zurückgegeben hat. Der Timeoutzeitraum wird über SQLSetStmtAttr SQL_ATTR_QUERY_TIMEOUT festgelegt.
HYT01 Verbindungstimeout abgelaufen Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT festgelegt.
IM001 Dieser Treiber unterstützt diese Funktion nicht. (DM) Der dem StatementHandle zugeordnete Treiber unterstützt die Funktion nicht.
IM017 Die Abrufung ist im asynchronen Benachrichtigungsmodus deaktiviert. Immer wenn das Benachrichtigungsmodell verwendet wird, ist die Abrufung deaktiviert.
IM018 SQLCompleteAsync wurde nicht aufgerufen, um den vorherigen asynchronen Vorgang für dieses Handle abzuschließen. Wenn der vorherige Funktionsaufruf für das Handle SQL_STILL_EXECUTING zurückgibt und der Benachrichtigungsmodus aktiviert ist, muss SQLCompleteAsync für das Handle aufgerufen werden, um die Nachbearbeitung durchzuführen und den Vorgang abzuschließen.

Kommentare

Wenn das IdentifierType-Argument SQL_BEST_ROWID ist, gibt SQLSpecialColumns die Spalte oder Spalten zurück, die jede Zeile in der Tabelle eindeutig identifizieren. Diese Spalten können immer in einer Select-List- oder WHERE-Klausel verwendet werden. SQLColumns, das verwendet wird, um eine Vielzahl von Informationen in den Spalten einer Tabelle zurückzugeben, gibt nicht unbedingt die Spalten zurück, die jede Zeile eindeutig identifizieren, oder Spalten, die automatisch aktualisiert werden, wenn ein Wert in der Zeile durch eine Transaktion aktualisiert wird. Zum Beispiel geben SQLColumns möglicherweise nicht das Oracle-Pseudo-Spalten-ROWID zurück. Deshalb wird SQLSpecialColumns verwendet, um diese Spalten zurückzugeben. Weitere Informationen finden Sie unter Verwendung von Katalogdaten.

Note

Weitere Informationen zur allgemeinen Verwendung, zu Argumenten und zurückgegebenen Daten von ODBC-Katalogfunktionen finden Sie unter Katalogfunktionen.

Gibt es keine Spalten, die jede Zeile in der Tabelle eindeutig identifizieren, gibt SQLSpecialColumns eine Zeilenmenge ohne Zeilen zurück; ein anschließender Aufruf von SQLFetch oder SQLFetchScroll auf der Anweisung liefert SQL_NO_DATA.

Wenn die IdentifierType-, Scope- oder Nullable-Argumente Eigenschaften angeben, die von der Datenquelle nicht unterstützt werden, liefert SQLSpecialColumns eine leere Ergebnismenge zurück.

Wenn das Attribut SQL_ATTR_METADATA_ID-Anweisung auf SQL_TRUE gesetzt ist, werden die Argumente CatalogName,SchemaName und TableName als Identifikatoren behandelt, sodass sie in bestimmten Situationen nicht auf einen Nullzeiger gesetzt werden können. (Weitere Informationen finden Sie unter Argumente in Katalogfunktionen.)

SQLSpecialColumns liefert die Ergebnisse als Standardergebnisset, geordnet nach SCOPE.

Die folgenden Spalten wurden für ODBC 3.x umbenannt. Die Änderungen des Spaltennamens beeinflussen die Abwärtskompatibilität nicht, da Anwendungen nach Spaltennummer binden.

ODBC 2.0-Spalte ODBC 3.x-Spalte
PRECISION COLUMN_SIZE
Länge BUFFER_LENGTH
MAßSTAB DEZIMALSTELLEN

Um die tatsächliche Länge der COLUMN_NAME-Spalte zu bestimmen, kann eine Anwendung SQLGetInfo mit der SQL_MAX_COLUMN_NAME_LEN-Option aufrufen.

In der folgenden Tabelle sind die Spalten im Resultset aufgeführt. Zusätzliche Spalten über Spalte 8 (PSEUDO_COLUMN) hinaus können vom Treiber definiert werden. Eine Anwendung sollte auf treiberspezifische Spalten zuzugreifen, indem sie vom Ende der Ergebnismenge herunterzählt, anstatt eine explizite Ordinalposition anzugeben. Weitere Informationen finden Sie unter "Von Katalogfunktionen zurückgegebene Daten".

Spaltenname Spaltennummer Datentyp Kommentare
SCOPE (ODBC 1.0) 1 Smallint Tatsächlicher Umfang des Rowid. Enthält einen der folgenden Werte:

SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION

NULL wird zurückgegeben, wenn IdentifierType SQL_ROWVER ist. Für eine Beschreibung jedes Wertes siehe die Beschreibung von Scope in "Syntax" früher in diesem Abschnitt.
COLUMN_NAME (ODBC 1.0) 2 Varchar nicht NULL Spaltenname. Der Treiber gibt eine leere Zeichenkette für eine Spalte zurück, die keinen Namen hat.
DATA_TYPE (ODBC 1.0) 3 Smallint nicht NULL SQL-Datentyp. Dies kann ein ODBC-SQL-Datentyp oder ein treiberspezifischer SQL-Datentyp sein. Eine Liste gültiger ODBC-SQL-Datentypen finden Sie unter SQL Data Types. Informationen zu treiberspezifischen SQL-Datentypen finden Sie in der Dokumentation des Treibers.
TYPE_NAME (ODBC 1.0) 4 Varchar nicht NULL Datenquellenabhängiger Datentypname; Beispiel: "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" oder "CHAR ( ) FOR BIT DATA".
COLUMN_SIZE (ODBC 1.0) 5 Integer Die Größe der Spalte in der Datenquelle. Weitere Informationen zur Spaltengröße finden Sie unter Spaltengröße, Dezimalziffern, Übertragungslänge des Oktetts und Anzeigegröße.
BUFFER_LENGTH (ODBC 1.0) 6 Integer Die Länge in Bytes, die in einem SQLGetData- oder SQLFetch-vorgang übertragen werden, wenn SQL_C_DEFAULT angegeben ist. Bei numerischen Daten kann sich diese Größe von der Größe der in der Datenquelle gespeicherten Daten unterscheiden. Dieser Wert könnte sich von COLUMN_SIZE Spalte für Zeichendaten unterscheiden. Weitere Informationen finden Sie unter Spaltengröße, Dezimalziffern, Transfer-Oktettlänge und Anzeigegröße.
DECIMAL_DIGITS (ODBC 1.0) 7 Smallint Die Dezimalziffern der Spalte in der Datenquelle. NULL wird für Datentypen zurückgegeben, bei denen keine Dezimalziffern anwendbar sind. Weitere Informationen zu Dezimalziffern finden Sie unter Spaltengröße, Dezimalziffern, Transfer Oktett Länge und Display Size.
PSEUDO_COLUMN (ODBC 2.0) 8 Smallint Gibt an, ob die Spalte eine Pseudo-Spalte ist, wie zum Beispiel Oracle ROWID:

SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO Hinweis: Für maximale Interoperabilität sollten Pseudo-Spalten nicht mit dem von SQLGetInfo zurückgegebenen Identifikationszeichen zitiert werden.

Nachdem die Anwendung Werte für SQL_BEST_ROWID abgerufen hat, kann sie diese Werte verwenden, um diese Zeile innerhalb des definierten Umfangs erneut auszuwählen. Die SELECT-Anweisung gibt garantiert entweder keine Zeilen oder nur eine Zeile zurück.

Wenn eine Anwendung eine Zeile basierend auf der Rowid-Spalte oder den Spalten erneut auswählt und die Zeile nicht gefunden wird, kann die Anwendung davon ausgehen, dass die Zeile gelöscht oder die Rowid-Spalten geändert wurden. Das Gegenteil ist nicht der Fall: Selbst wenn sich das Rowid nicht geändert hat, könnten sich die anderen Spalten in der Zeile verändert haben.

Spalten, die für Spaltentyp SQL_BEST_ROWID zurückgegeben werden, sind nützlich für Anwendungen, die innerhalb eines Ergebnissets vor- und zurückscrollen müssen, um die aktuellsten Daten aus einer Reihe von Zeilen abzurufen. Die Spalte oder Spalten des Rowid ändern sich garantiert nicht, während sie auf dieser Zeile positioniert sind.

Die Spalte oder Spalten des Rowid können auch dann gültig bleiben, wenn der Cursor nicht auf der Zeile positioniert ist; die Anwendung kann dies bestimmen, indem sie die Spalte SCOPE im Ergebnisset überprüft.

Für Spaltentyp SQL_ROWVER zurückgegebene Spalten sind nützlich für Anwendungen, die die Möglichkeit benötigen, zu überprüfen, ob Spalten in einer bestimmten Zeile aktualisiert wurden, während die Zeile mit der Rowid neu ausgewählt wurde. Zum Beispiel kann die Anwendung nach der erneuten Auswahl einer Zeile mit rowid die vorherigen Werte in den SQL_ROWVER Spalten mit den gerade abgerufenen vergleichen. Wenn der Wert in einer SQL_ROWVER-Spalte vom vorherigen abweicht, kann die Anwendung den Benutzer darauf hinweisen, dass sich die Daten auf der Anzeige geändert haben.

Codebeispiel

Ein Codebeispiel für eine ähnliche Funktion finden Sie unter SQLColumns.

Weitere Informationen zu Siehe
Binden eines Puffers an eine Spalte in einem Resultset SQLBindCol-Funktion
Abbrechen der Verarbeitung von Anweisungen SQLCancel-Funktion
Rückgabe der Spalten in einer Tabelle oder mehreren Tabellen SQLColumns-Funktion
Abruf einer einzelnen Zeile oder einem Datenblock in einer ausschließlich vorwärtsgerichteten Richtung SQLFetch-Funktion
Abrufen eines Datenblocks oder Scrollen durch ein Resultset SQLFetchScroll-Funktion
Zurückgeben der Spalten eines Primärschlüssels SQLPrimaryKeys-Funktion