Konstruera SQL-instruktioner för markörer

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

SQL Server Native Client ODBC-drivrutinen använder servermarkörer för att implementera markörfunktionen som definieras i ODBC-specifikationen. En ODBC-applikation styr markörbeteendet genom att använda SQLSetStmtAttr för att sätta olika satsattribut. Detta är attributen och deras standardvärden.

Attribute Standardinställning
SQL_ATTR_CONCURRENCY SQL_CONCUR_READ_ONLY
SQL_ATTR_CURSOR_TYPE SQL_CURSOR_FORWARD_ONLY
SQL_ATTR_CURSOR_SCROLLABLE SQL_NONSCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY SQL_UNSPECIFIED
SQL_ATTR_ROW_ARRAY_SIZE 1

När dessa alternativ är inställda till sina standardinställningar vid tidpunkten för att en SQL-sats exekveras använder SQL Server Native Client ODBC-drivrutinen inte en servermarkör för att implementera resultatuppsättningen; istället använder den en standardresultatuppsättning. Om något av dessa alternativ ändras från sina standardinställningar vid tidpunkten för att en SQL-sats körs, försöker SQL Server Native Client ODBC-drivrutinen använda en servermarkör för att implementera resultatuppsättningen.

Standardresultatuppsättningar stöder alla Transact-SQL-satser. Det finns inga begränsningar för vilka typer av SQL-satser som kan köras när man använder en standardresultatuppsättning.

Servermarkörer stöder inte alla Transact-SQL-satser. Servermarkörer stöder inte några SQL-satser som genererar flera resultatuppsättningar.

Följande typer av satser stöds inte av servermarkörer:

  • Omgångar

    SQL-satser byggda av två eller flera individuella SQL SELECT-satser, till exempel:

    SELECT * FROM Authors; SELECT * FROM Titles  
    
  • Lagrade procedurer med flera SELECT-satser

    SQL-satser som kör en lagrad procedur som innehåller mer än ett SELECT-uttalande. Detta inkluderar SELECT-satser som fyller parametrar eller variabler.

  • nyckelord

    SQL-satser som innehåller nyckelorden FOR BROWSE, eller INTO.

I SQL Server, om en SQL-sats som uppfyller något av dessa villkor körs med en servermarkör, konverteras servermarkören implicit till en standardresultatuppsättning. Efter att SQLExecDirect eller SQLExecute returnerat SQL_SUCCESS_WITH_INFO kommer markörattributen att återställas till sina standardinställningar.

SQL-satser som inte passar in i ovanstående kategorier kan köras med vilka attributinställningar som helst; De fungerar lika bra med antingen en standarduppsättning resultat eller en servermarkör.

Errors

I SQL Server 7.0 och senare genererar ett försök att köra en sats som producerar flera resultatuppsättningar SQL_SUCCESS_WITH INFO och följande meddelande:

SqlState: 01S02"  
pfNative: 0  
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]  
               Cursor type changed."  

ODBC-applikationer som tar emot detta meddelande kan anropa SQLGetStmtAttr för att bestämma de aktuella kursorinställningarna.

Ett försök att köra en procedur med flera SELECT-satser när servermarkörer används genererar följande fel:

SqlState: 42000  
pfNative: 16937  
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]  
               A server cursor is not allowed on a stored procedure  
               with more than one SELECT statement in it. Use a  
               default result set or client cursor.  

Ett försök att köra en batch med flera SELECT-satser när servermarkörer används genererar följande fel:

SqlState: 42000  
pfNative: 16938  
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]  
               sp_cursoropen. The statement parameter can only  
               be a single SELECT statement or a single stored   
               procedure.  

ODBC-applikationer som får dessa fel måste återställa alla markörsatsattribut till deras standardinställningar innan de försöker köra satsen.