Verarbeiten von Ergebnissen (ODBC)

Wenn eine Anwendung eine SQL-Anweisung übermittelt, gibt SQL Server alle resultierenden Daten als ein oder mehrere Resultsets zurück. Ein Resultset ist ein Satz von Zeilen und Spalten, die den Kriterien der Abfrage entsprechen. SELECT-Anweisungen, Katalogfunktionen sowie einige gespeicherte Prozeduren erzeugen Resultsets, die für eine Anwendung in der Form von tabellarischen Daten verfügbar gemacht werden. Wenn es sich bei der ausgeführten SQL-Anweisung um eine gespeicherte Prozedur, einen Batch mit mehreren Befehlen oder eine SELECT-Anweisung mit Schlüsselwörtern wie COMPUTE oder COMPUTE BY handelt, ergeben sich daraus mehrere zu verarbeitende Resultsets.

Auch ODBC-Katalogfunktionen können Daten abrufen. Beispielsweise ruft SQLColumns Daten über Spalten in der Datenquelle ab. Diese Resultsets können 0 (null) oder mehr Zeilen enthalten.

Andere SQL-Anweisungen, z. B. GRANT oder REVOKE, geben keine Resultsets zurück. Bei diesen Anweisungen ist normalerweise der Rückgabecode von SQLExecute oder SQLExecDirect der einzige Hinweis darauf, dass die Anweisung ordnungsgemäß ausgeführt wurde.

Jede INSERT-, UPDATE- und DELETE-Anweisung gibt ein Resultset zurück, das nur die Anzahl der von der Änderung betroffenen Zeilen enthält. Diese Anzahl wird verfügbar gemacht, wenn die Anwendung SQLRowCount aufruft. ODBC 3.x-Anwendungen müssen entweder SQLRowCount aufrufen, um das Resultset abzurufen, oder SQLMoreResults, um es zu annullieren. Wenn eine Anwendung einen Batch oder eine gespeicherte Prozedur mit mehreren INSERT-, UPDATE- oder DELETE-Anweisungen ausführt, muss das Resultset jeder Änderungsanweisung unter Verwendung von SQLRowCount verarbeitet oder mit SQLMoreResults annulliert werden. Die Anzahlangaben können durch eine SET NOCOUNT ON-Anweisung im Batch oder in der gespeicherten Prozedur annulliert werden.

Transact-SQL enthält die SET NOCOUNT-Anweisung. Wenn die NOCOUNT-Option aktiviert ist, gibt SQL Server die Anzahl der von einer Anweisung betroffenen Zeilen nicht zurück, und SQLRowCount gibt 0 (null) zurück. In der SQL Server Native Client ODBC-Treiberversion wurde eine treiberspezifische SQLGetStmtAttr-Option, SQL_SOPT_SS_NOCOUNT_STATUS, eingeführt, die meldet, ob die NOCOUNT-Option aktiviert oder deaktiviert ist. Jedes Mal, wenn SQLRowCount 0 zurückgibt, sollte die Anwendung SQL_SOPT_SS_NOCOUNT_STATUS testen. Wenn SQL_NC_ON zurückgegeben wird, zeigt der Wert 0 aus SQLRowCount lediglich an, dass SQL Server keine Zeilenanzahl zurückgegeben hat. Wird SQL_NC_OFF zurückgegeben, bedeutet dies, dass NOCOUNT deaktiviert ist, und der Wert 0 aus SQLRowCount zeigt an, dass keine Zeilen von der Anweisung betroffen waren. Anwendungen sollten den Wert von SQLRowCount nicht anzeigen, wenn SQL_SOPT_SS_NOCOUNT_STATUS SQL_NC_OFF ist. Große Batches oder gespeicherte Prozeduren können mehrere SET NOCOUNT-Anweisungen enthalten. Daher kann der Programmierer nicht davon ausgehen, dass SQL_SOPT_SS_NOCOUNT_STATUS konstant bleibt. Diese Option sollte jedes Mal getestet werden, wenn SQLRowCount 0 zurückgibt.

Mehrere andere Transact-SQL-Anweisungen geben ihre Daten in Meldungen statt in Resultsets zurück. Wenn der SQL Server Native Client ODBC-Treiber diese Meldungen empfängt, gibt er SQL_SUCCESS_WITH_INFO zurück, um der Anwendung zu signalisieren, dass Informationsmeldungen verfügbar sind. Die Anwendung kann dann SQLGetDiagRec aufrufen, um diese Meldungen abzurufen. Die Transact-SQL-Anweisungen, die auf diese Weise funktionieren, sind folgende:

  • DBCC

  • SET SHOWPLAN (mit früheren Versionen von SQL Server verfügbar)

  • SET STATISTICS

  • PRINT

  • RAISERROR

Der SQL Server Native Client ODBC-Treiber gibt SQL_ERROR nach einem RAISERROR mit einem Schweregrad von mindestens 11 zurück. Ist der Schweregrad von RAISERROR 19 oder mehr, wird auch die Verbindung unterbrochen.

Zum Verarbeiten der Resultsets aus einer SQL-Anweisung geht die Anwendung folgendermaßen vor:

  • Sie bestimmt die Charakteristika des Resultsets.

  • Sie bindet die Spalten an Programmvariable.

  • Sie ruft einen einzelnen Wert, eine ganze Zeile mit Werten oder mehrere Zeilen mit Werten ab.

  • Sie überprüft, ob weitere Resultsets vorhanden sind, und wenn dies der Fall ist, ermittelt sie die Charakteristika des neuen Resultsets.

Der Prozess des Abrufens von Zeilen aus der Datenquelle und deren Rückgabe an die Anwendung wird "Fetching" (Abrufen) genannt.

Abrufen von COMPUTE und COMPUTE BY-Resultsets

Die COMPUTE BY-Klausel generiert Teilergebnisse in einem Resultset. Die COMPUTE-Klausel generiert ein Gesamtergebnis am Ende des Resultsets. Der SQL Server Native Client ODBC-Treiber präsentiert der aufrufenden Anwendung diese Teil- und Gesamtergebnisse, indem er für jede SELECT-Anweisung mehrere Resultsets generiert.

Im folgenden Beispiel werden COMPUTE BY verwendet, um Teilergebnisse, und COMPUTE, um ein Gesamtergebnis zu generieren:

SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
  AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

Diese Anweisungen verursachen die Berechnung eines Teilergebnisses für den Durchschnittspreis und die Summe der Vorbestellungen für jeden Buchtyp und schließlich eine Gesamtsumme mit dem Preis und den Vorbestellungsdaten. Der Treiber präsentiert das erste Resultset für die Zeilen der Bücher mit dem ersten Buchtyp. Anschließend erzeugt er ein zweites Resultset mit den zwei COMPUTE BY-Spalten für AVG(price) und SUM(advance) für diesen ersten Satz von Büchern. Dann erzeugt er ein drittes Resultset für die nächste Büchergruppe, sowie ein viertes Resultset mit den COMPUTE BY-Teilergebnissen für diese Gruppe. Der Treiber kombiniert diese Resultsets, bis das endgültige Resultset mit dem Gesamtergebnis für die COMPUTE SUM(price), SUM(advance)-Klausel erzeugt ist.