Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Överensstämmelse
Version introducerad: ODBC 1.0 Standardsefterlevnad: Open Group
Summary
SQLSpecialColumns hämtar följande information om kolumner inom en specificerad tabell:
Den optimala uppsättningen kolumner som unikt identifierar en rad i tabellen.
Kolumner som automatiskt uppdateras när något värde i raden uppdateras av en transaktion.
Syntax
SQLRETURN SQLSpecialColumns(
SQLHSTMT StatementHandle,
SQLSMALLINT IdentifierType,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLSMALLINT Scope,
SQLSMALLINT Nullable);
Arguments
StatementHandle
[Indata] Instruktionshandtag.
IdentifierType
[Input] Typ av kolumn att returnera. Måste vara något av följande värden:
SQL_BEST_ROWID: Returnerar den optimala kolumnen eller uppsättningen av kolumner som, genom att hämta värden från kolumnen eller kolumnerna, gör det möjligt att identifiera vilken rad som helst i den angivna tabellen entyd. En kolumn kan vara antingen en pseudokolumn som är specifikt utformad för detta ändamål (som i Oracle ROWID eller Ingres TID) eller kolumnen eller kolumnerna i vilket unikt index som helst för tabellen.
SQL_ROWVER: Returnerar kolumnen eller kolumnerna i den angivna tabellen, om sådana finns, som automatiskt uppdateras av datakällan när något värde i raden uppdateras av någon transaktion (som i SQLBase ROWID eller Sybase TIMESTAMP).
CatalogName
[Input] Katalognamnet för bordet. Om en drivrutin stödjer kataloger för vissa tabeller men inte för andra, till exempel när drivrutinen hämtar data från olika databaser, betecknar en tom sträng ("") de tabeller som inte har kataloger.
CatalogName kan inte innehålla ett strängsökningsmönster.
Om attributet SQL_ATTR_METADATA_ID sats sätts till SQL_TRUE behandlas CatalogName som en identifierare och dess fall är inte signifikant. Om det är SQL_FALSE är CatalogName ett vanligt argument; Den behandlas bokstavligt, och dess fall är betydelsefullt. Mer information finns i Argument i Katalogfunktioner.
NameLength1
[Input] Längd i tecken i *CatalogName.
Schema-namn
[Input] Schemanamnet för tabellen. Om en drivrutin stöder scheman för vissa tabeller men inte för andra, till exempel när drivrutinen hämtar data från olika databassystem, betecknar en tom sträng ("") de tabeller som inte har scheman.
SchemaName kan inte innehålla ett strängsökningsmönster.
Om attributet SQL_ATTR_METADATA_ID är satt till SQL_TRUE behandlas SchemaName som en identifierare och dess fall är inte signifikant. Om det är SQL_FALSE är SchemaName ett vanligt argument; Den behandlas bokstavligt, och dess fall är betydelsefullt.
NameLength2
[Input] Längd i tecken i *SchemaName.
TableName
[Indata] Tabellnamn. Detta argument kan inte vara en nollpekare.
TableName kan inte innehålla ett strängsökningsmönster.
Om attributet SQL_ATTR_METADATA_ID sats sätts till SQL_TRUE behandlas TableName som en identifierare och dess fall är inte signifikant. Om det är SQL_FALSE är TableName ett vanligt argument; Den behandlas bokstavligt, och dess fall är betydelsefullt.
NameLength3
[Input] Längd i tecken av *TableName.
Scope
[Input] Minsta nödvändiga omfattning av rowid. Den återvändande rowiden kan vara av större omfattning. Måste vara något av följande:
SQL_SCOPE_CURROW: Rowiden är garanterad att vara giltig endast när den står på den raden. En senare omval med rowid kanske inte returnerar en rad om raden uppdaterades eller raderades av en annan transaktion.
SQL_SCOPE_TRANSACTION: Rowid är garanterat giltigt under hela den aktuella transaktionens varaktighet.
SQL_SCOPE_SESSION: Rowid är garanterad att vara giltig under hela sessionen (över transaktionsgränser).
Nullbar
[Input] Avgör om specialkolumner som kan ha ett NULL-värde ska returneras. Måste vara något av följande:
SQL_NO_NULLS: Uteslut specialkolumner som kan ha NULL-värden. Vissa drivrutiner kan inte stödja SQL_NO_NULLS, och dessa drivrutiner returnerar en tom resultatuppsättning om SQL_NO_NULLS specificerades. Ansökningar bör förberedas för detta fall och begära SQL_NO_NULLS endast om det absolut krävs.
SQL_NULLABLE: Returnera speciella kolumner även om de kan ha NULL-värden.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR eller SQL_INVALID_HANDLE.
Diagnostics
När SQLSpecialColumns returnerar SQL_ERROR eller SQL_SUCCESS_WITH_INFO kan ett associerat SQLSTATE-värde erhållas genom att anropa SQLGetDiagRec med en HandleType av SQL_HANDLE_STMT och ett Handle av StatementHandle. Följande tabell listar de SQLSTATE-värden som vanligtvis returneras av SQLSpecialColumns och förklarar var och en i kontexten av denna funktion; notationen "(DM)" föregår beskrivningarna av SQLSTATE som returneras av Driver Manager. Returkoden som är associerad med varje SQLSTATE-värde är SQL_ERROR, om inget annat anges.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Allmän varning | Informationsmeddelande för drivrutinsspecifikt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) |
| 08S01 | Kommunikationslänkfel | Kommunikationslänken mellan drivrutinen och datakällan som drivrutinen var ansluten till misslyckades innan funktionen slutförde bearbetningen. |
| 24000 | Ogiltigt markörtillstånd | En markör var öppen på StatementHandle, och SQLFetch eller SQLFetchScroll hade anropats. Detta fel returneras av drivrutinshanteraren om SQLFetch eller SQLFetchScroll inte har returnerat SQL_NO_DATA och returneras av drivrutinen om SQLFetch eller SQLFetchScroll har returnerat SQL_NO_DATA. En markör var öppen på StatementHandle, men SQLFetch eller SQLFetchScroll hade inte anropats. |
| 40001 | Serialiseringsfel | Transaktionen återställdes på grund av ett resursstopp med en annan transaktion. |
| 40003 | Slutförande av instruktion okänd | Den associerade anslutningen misslyckades under körningen av den här funktionen och transaktionens tillstånd kan inte fastställas. |
| HY000 | Allmänt fel | Ett fel uppstod för vilket det inte fanns någon specifik SQLSTATE och för vilken ingen implementeringsspecifik SQLSTATE definierades. Felmeddelandet som returnerades av SQLGetDiagRec i *MessageText-bufferten beskriver felet och dess orsak. |
| HY001 | Fel vid minnesallokering | Drivrutinen kunde inte allokera minne som krävs för körning eller slutförande av funktionen. |
| HY008 | Åtgärden avbröts | Asynkron bearbetning aktiverades för StatementHandle. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandle. Sedan anropades funktionen igen på StatementHandle. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandle från en annan tråd i ett flertrådsprogram. |
| HY009 | Ogiltig användning av null-pekare |
Argumentet TableName var en null-pekare. Attributet SQL_ATTR_METADATA_ID statement sattes till SQL_TRUE, argumentet CatalogName var en nullpekare, och SQL_CATALOG_NAME InfoType visar att katalognamn stöds. (DM) Attributet SQL_ATTR_METADATA_ID sats sattes till SQL_TRUE, och SchemaName-argumentet var en nullpekare. |
| HY010 | Funktionssekvensfel | (DM) En asynkront körande funktion anropades för anslutningshandtaget som är associerat med StatementHandle. Denna funktion kördes fortfarande när SQLSpecialColumns anropades . (DM) SQLExecute, SQLExecDirect eller SQLMoreResults anropades för StatementHandle och returnerades SQL_PARAM_DATA_AVAILABLE. Den här funktionen anropades innan data hämtades för alla strömmade parametrar. (DM) En asynkront körande funktion (inte den här) anropades för StatementHandle och kördes fortfarande när den här funktionen anropades. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations eller SQLSetPos anropades för StatementHandle och returnerades SQL_NEED_DATA. Den här funktionen anropades innan data skickades för alla data-at-execution-parametrar eller kolumner. |
| HY013 | Minneshanteringsfel | Det gick inte att bearbeta funktionsanropet eftersom det inte gick att komma åt underliggande minnesobjekt, möjligen på grund av minnesbrist. |
| HY090 | Ogiltig sträng- eller buffertlängd | (DM) Värdet på ett av längdargumenten var mindre än 0 men inte lika med SQL_NTS. Värdet på ett av längdargumenten översteg det maximala längdvärdet för motsvarande namn. Den maximala längden på varje namn kan erhållas genom att anropa SQLGetInfo med InfoType-värdena : SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN eller SQL_MAX_TABLE_NAME_LEN. |
| HY097 | Kolonntyp utanför räckvidden | (DM) Ett ogiltigt IdentifierType-värde angavs. |
| HY098 | Teleskoptyp utanför räckvidden | (DM) Ett ogiltigt Scope-värde angavs. |
| HY099 | Nullbar typ utanför räckvidd | (DM) Ett ogiltigt Nullable-värde angavs. |
| HY117 | Anslutningen pausas på grund av okänt transaktionstillstånd. Endast frånkopplings- och skrivskyddade funktioner tillåts. | (DM) Mer information om pausat tillstånd finns i SQLEndTran-funktion. |
| HYC00 | Valfri funktion har inte implementerats | En katalog specificerades, och drivrutinen eller datakällan stöder inte kataloger. Ett schema specificerades, och drivrutinen eller datakällan stöder inte scheman. Kombinationen av de aktuella inställningarna för SQL_ATTR_CONCURRENCY- och SQL_ATTR_CURSOR_TYPE-instruktionsattributen stöds inte av drivrutinen eller datakällan. SQL_ATTR_USE_BOOKMARKS-instruktionsattributet har angetts till SQL_UB_VARIABLE och SQL_ATTR_CURSOR_TYPE-instruktionsattributet har angetts till en markörtyp som drivrutinen inte stöder bokmärken för. |
| HYT00 | Tidsgränsen har upphört att gälla | Tidsgränsen för frågan löpte ut innan datakällan returnerade den begärda resultatuppsättningen. Tidsgränsen anges via SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT. |
| HYT01 | Tidsgränsen för anslutningen gick ut | Tidsgränsen för anslutningen löpte ut innan datakällan svarade på begäran. Tidsgränsen för anslutningen anges via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | Drivrutinen stöder inte den här funktionen | (DM) Drivrutinen som är associerad med StatementHandle stöder inte funktionen. |
| IM017 | Avsökning är inaktiverat i asynkront meddelandeläge | När meddelandemodellen används inaktiveras avsökningen. |
| IM018 | SQLCompleteAsync har inte anropats för att slutföra den tidigare asynkrona åtgärden på det här handtaget. | Om det tidigare funktionsanropet på handtaget returnerar SQL_STILL_EXECUTING och om meddelandeläget är aktiverat måste SQLCompleteAsync anropas på handtaget för att utföra efterbearbetningen och slutföra åtgärden. |
Comments
När IdentifierType-argumentet är SQL_BEST_ROWID returnerar SQLSpecialColumns kolumnen eller kolumnerna som unikt identifierar varje rad i tabellen. Dessa kolumner kan alltid användas i en select-list eller WHERE-klausul . SQLColumns, som används för att returnera olika typer av information på kolumnerna i en tabell, returnerar inte nödvändigtvis de kolumner som unikt identifierar varje rad, eller kolumner som automatiskt uppdateras när något värde i raden uppdateras av en transaktion. Till exempel kanske SQLColumns inte returnerar Oracle-pseudokolumnen ROWID. Det är därför SQLSpecialColumns används för att returnera dessa kolumner. Mer information finns i Användning av katalogdata.
Note
Mer information om allmän användning, argument och returnerade data för ODBC-katalogfunktioner finns i Katalogfunktioner.
Om det inte finns några kolumner som entydigt identifierar varje rad i tabellen, returnerar SQLSpecialColumns en radmängd utan rader; ett efterföljande anrop till SQLFetch eller SQLFetchScroll på satsen returnerar SQL_NO_DATA.
Om argumenten IdentifierType, Scope eller Nullable specificerar egenskaper som inte stöds av datakällan, returnerar SQLSpecialColumns en tom resultatuppsättning.
Om attributet SQL_ATTR_METADATA_ID satsen sätts till SQL_TRUE behandlas argumenten CatalogName,SchemaName och TableName som identifierare, så de kan inte sättas till en nullpekare i vissa situationer. (För mer information, se Argument i katalogfunktioner.)
SQLSpecialColumns returnerar resultaten som en standardmängd resultat, ordnade efter SCOPE.
Följande kolumner har bytt namn för ODBC 3.x. Kolumnnamnsändringarna påverkar inte bakåtkompatibilitet eftersom applikationer binds efter kolumnnummer.
| ODBC 2.0-kolumn | ODBC 3.x-kolumn |
|---|---|
| PRECISION | KOLUMN_STORLEK |
| LÄNGD | BUFFERT_LÄNGD |
| SKALA | decimaltecken |
För att bestämma den faktiska längden på kolumnen COLUMN_NAME kan en applikation anropa SQLGetInfo med alternativet SQL_MAX_COLUMN_NAME_LEN.
I följande tabell visas kolumnerna i resultatuppsättningen. Ytterligare kolumner utöver kolumn 8 (PSEUDO_COLUMN) kan definieras av drivrutinen. En applikation bör få tillgång till drivrutinsspecifika kolumner genom att räkna ner från slutet av resultatuppsättningen istället för att specificera en explicit ordinal position. Mer information finns i Data som returneras av katalogfunktioner.
| Kolumnnamn | Kolumnnummer | Datatyp | Comments |
|---|---|---|---|
| OMFATTNING (ODBC 1.0) | 1 | Smallint | Den faktiska omfattningen av rowiden. Innehåller ett av följande värden: SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION NULL returneras när IdentifierType är SQL_ROWVER. För en beskrivning av varje värde, se beskrivningen av Scope i "Syntax" tidigare i detta avsnitt. |
| COLUMN_NAME (ODBC 1.0) | 2 | Varchar inte NULL | Kolumnnamn. Drivrutinen returnerar en tom sträng för en kolumn som inte har något namn. |
| DATA_TYPE (ODBC 1.0) | 3 | Smallint, inte NULL | SQL-datatyp. Detta kan vara en ODBC SQL-datatyp eller en drivrutinsspecifik SQL-datatyp. För en lista över giltiga ODBC SQL-datatyper, se SQL Data Types. Information om drivrutinsspecifika SQL-datatyper finns i drivrutinsdokumentationen. |
| TYPE_NAME (ODBC 1.0) | 4 | Varchar inte NULL | Namn på datakällaberoende datatyp; till exempel "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" eller "CHAR ( ) FOR BIT DATA". |
| COLUMN_SIZE (ODBC 1.0) | 5 | Integer | Storleken på kolumnen i datakällan. För mer information om kolumnstorlek, se Kolumnstorlek, Decimalsiffror, Överför oktettlängd och Visningsstorlek. |
| BUFFER_LENGTH (ODBC 1.0) | 6 | Integer | Längden i byte av data som överförs på en SQLGetData- eller SQLFetch åtgärd om SQL_C_DEFAULT anges. För numeriska data kan den här storleken skilja sig från storleken på data som lagras på datakällan. Detta värde kan skilja sig från COLUMN_SIZE kolumn för teckendata. För mer information, se Kolumnstorlek, Decimalsiffror, Överföring av oktettlängd och Visningsstorlek. |
| DECIMAL_DIGITS (ODBC 1.0) | 7 | Smallint | Decimalsiffrorna i kolumnen på datakällan. NULL returneras för datatyper där decimalsiffror inte är tillämpliga. För mer information om decimalsiffror, se Kolumnstorlek, Decimalsiffror, Överföring av oktettlängd och Visningsstorlek. |
| PSEUDO_COLUMN (ODBC 2.0) | 8 | Smallint | Anger om kolumnen är en pseudokolumn, såsom Oracle ROWID: SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO Not: För maximal interoperabilitet bör pseudokolumner inte citeras med identifierarcitattecknet som returneras av SQLGetInfo. |
Efter att applikationen hämtat värden för SQL_BEST_ROWID kan den använda dessa värden för att återvälja raden inom det definierade omfånget. SELECT-satsen garanteras returnera antingen inga rader eller en rad.
Om en applikation väljer om en rad baserat på rowid-kolumnen eller kolumnerna och raden inte hittas, kan applikationen anta att raden har tagits bort eller att rowid-kolumnerna har ändrats. Det motsatta är inte sant: även om rowiden inte har ändrats kan de andra kolumnerna i raden ha ändrats.
Kolumner som returneras för kolumntyp SQL_BEST_ROWID är användbara för applikationer som behöver scrolla framåt och tillbaka inom en resultatuppsättning för att hämta den senaste datan från en rad rader. Kolumnen eller kolumnerna i rowiden är garanterade att inte ändras medan de är placerade på den raden.
Kolumnen eller kolumnerna i rowiden kan förbli giltiga även när markören inte är placerad på raden; applikationen kan avgöra detta genom att kontrollera kolumnen SCOPE i resultatuppsättningen.
Kolumner som returneras för kolumntyp SQL_ROWVER är användbara för applikationer som behöver möjligheten att kontrollera om några kolumner i en viss rad har uppdaterats medan raden valts om med rowid. Till exempel, efter att ha valt en rad igen med rowid kan applikationen jämföra tidigare värden i de SQL_ROWVER kolumnerna med de som just hämtats. Om värdet i en SQL_ROWVER kolumn skiljer sig från det föregående kan applikationen varna användaren om att data på skärmen har ändrats.
Kodexempel
För ett kodexempel på en liknande funktion, se SQLColumns.
Relaterade funktioner
| Mer information om | Se |
|---|---|
| Binda en buffert till en kolumn i en resultatuppsättning | SQLBindCol-funktion |
| Avbryta instruktionsbearbetning | SQLCancel-funktion |
| Returnera kolumnerna i en tabell eller tabeller | SQLColumns-funktionen |
| Att hämta en enda rad eller ett datablock i en framåtriktad riktning | SQLFetch-funktion |
| Hämtar ett datablock eller bläddrar igenom en resultatuppsättning | SQLFetchScroll-funktion |
| Returnera kolumnerna i en primärnyckel | SQLPrimaryKeys-funktion |