Konstruowanie instrukcji SQL dla kursorów

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Sterownik ODBC dla natywnego klienta SQL Server wykorzystuje kursory serwera do implementacji funkcjonalności kursora zdefiniowanej w specyfikacji ODBC. Aplikacja ODBC kontroluje zachowanie kursora, wykorzystując SQLSetStmtAttr do ustawiania różnych atrybutów instrukcji. To są atrybuty i ich domyślne ustawienia.

Attribute Default
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

Gdy te opcje są ustawione na domyślne wartości w momencie wykonania instrukcji SQL, sterownik ODBC natywnego klienta SQL Server nie używa kursora serwera do implementacji zbioru wyników; zamiast tego używa domyślnego zestawu wyników. Jeśli któraś z tych opcji zostanie zmieniona względem domyślnego w momencie wykonania instrukcji SQL, sterownik ODBC dla natywnego klienta SQL Server próbuje użyć kursora serwera do implementacji zestawu wyników.

Domyślne zbiory wyników obsługują wszystkie Transact-SQL stwierdzenia. Nie ma ograniczeń dotyczących typów instrukcji SQL, które mogą być wykonywane przy użyciu domyślnego zbioru wyników.

Kursory serwera nie obsługują wszystkich Transact-SQL instrukcji. Kursory serwera nie obsługują żadnych instrukcji SQL generujących wiele zbiorów wyników.

Następujące typy instrukcji nie są obsługiwane przez kursory serwera:

  • Partie produkcyjne

    Instrukcje SQL zbudowane na podstawie dwóch lub więcej indywidualnych instrukcji SQL SELECT, na przykład:

    SELECT * FROM Authors; SELECT * FROM Titles  
    
  • Procedury przechowywane z wieloma instrukcjami SELECT

    Instrukcje SQL wykonujące procedurę przechowywaną zawierającą więcej niż jedną instrukcję SELECT. Dotyczy to także instrukcji SELECT wypełniających parametry lub zmienne.

  • Słowa kluczowe

    Instrukcje SQL zawierające słowa kluczowe FOR BROWSE, czyli INTO.

W SQL Server, jeśli instrukcja SQL spełniająca którykolwiek z tych warunków zostanie wykonana kursorem serwera, kursor serwera jest niejawnie konwertowany na domyślny zbiór wyników. Po zwróceniu SQL_SUCCESS_WITH_INFO przez SQLExecDirect lub SQLExecute , atrybuty kursora zostaną przywrócone do domyślnych ustawień.

Instrukcje SQL, które nie pasują do powyższych kategorii, mogą być wykonywane z dowolnymi ustawieniami atrybutów instrukcji; Działają równie dobrze zarówno z domyślnym zestawem wyników, jak i kursorem serwera.

Errors

W SQL Server 7.0 i późniejszych próba wykonania instrukcji generującej wiele zestawów wyników generuje SQL_SUCCESS_WITH INFO oraz następujący komunikat:

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

Aplikacje ODBC otrzymujące ten komunikat mogą wywołać SQLGetStmtAttr , aby określić aktualne ustawienia kursora.

Próba wykonania procedury z wieloma instrukcjami SELECT przy użyciu kursorów serwera generuje następujący błąd:

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.  

Próba wykonania partii z wieloma instrukcjami SELECT przy użyciu kursorów serwera generuje następujący błąd:

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.  

Aplikacje ODBC otrzymujące te błędy muszą zresetować wszystkie atrybuty instrukcji kursora do ich domyślnych wartości przed próbą wykonania instrukcji.