Обработка результатов (ODBC)

После передачи приложением инструкции SQL, SQL Server возвращает все данные результата в виде одного или нескольких результирующих наборов. Результирующий набор — это набор строк и столбцов, соответствующих критерию запроса. Инструкции SELECT, функции работы с каталогами и некоторые хранимые процедуры создают результирующий набор, доступный для приложения в табличной форме. Если выполненная инструкция SQL является хранимой процедурой, пакетом из нескольких команд, или инструкцией SELECT, содержащей ключевые слова (например, COMPUTE или COMPUTE BY), нужно будет обрабатывать несколько результирующих наборов.

Функции ODBC для работы с каталогами также могут получать данные. Например, функция SQLColumns получает данные о столбцах в источнике данных. Эти результирующие наборы могут содержать нуль или более строк.

Некоторые инструкции SQL, например GRANT или REVOKE, не возвращают результирующие наборы. Для этих инструкций, как правило, код возврата функции SQLExecute или SQLExecDirect является единственным признаком того, что инструкция была успешно выполнена.

Каждая из инструкций INSERT, UPDATE и DELETE возвращает результирующий набор, содержащий только количество строк, затронутых изменением. Этот счетчик доступен при вызове функции SQLRowCount. Приложения ODBC версии 3.x должны вызывать либо функцию SQLRowCount для получения результирующего набора, либо функцию SQLMoreResults для его сброса. Когда приложение выполняет пакет или хранимую процедуру, содержащую несколько инструкций INSERT, UPDATE или DELETE, результирующий набор каждой инструкции изменения нужно обработать с помощью функции SQLRowCount, либо сбросить с помощью функции SQLMoreResults. Эти счетчики можно сбросить, включив в пакет или хранимую процедуру инструкцию SET NOCOUNT ON.

Transact-SQL включает инструкцию SET NOCOUNT. Если параметр NOCOUNT включен, SQL Server не возвращает счетчики строк, затронутых инструкцией, а функция SQLRowCount возвращает 0. Версия драйвера ODBC собственного клиента SQL Server предоставляет зависящий от драйвера параметр функции SQLGetStmtAttr, SQL_SOPT_SS_NOCOUNT_STATUS, для сообщения, включен или нет параметр NOCOUNT. Если функция SQLRowCount возвращает 0, приложение должно проверить параметр SQL_SOPT_SS_NOCOUNT_STATUS. Если возвращается SQL_NC_ON, значение 0, возвращаемое функцией SQLRowCount, определяет только то, что SQL Server не вернул количество строк. Если возвращается SQL_NC_OFF, значит параметр NOCOUNT отключен и значение 0, возвращаемое функцией SQLRowCount, указывает, что инструкция не затронула ни одной строки. Приложения не должны отображать значение, возвращаемое функцией SQLRowCount, если параметр SQL_SOPT_SS_NOCOUNT_STATUS установлен в значение SQL_NC_OFF. Большие пакеты или хранимые процедуры могут содержать несколько инструкций SET NOCOUNT, следовательно, программисты не должны предполагать, что параметр SQL_SOPT_SS_NOCOUNT_STATUS останется неизменным. Данный параметр необходимо проверять каждый раз, когда функция SQLRowCount возвращает 0.

Несколько других инструкций Transact-SQL возвращают данные в сообщениях, а не в результирующих наборах. Когда драйвер ODBC собственного клиента SQL Server получает эти сообщения, он возвращает значение SQL_SUCCESS_WITH_INFO для уведомления приложения о том, что информационные сообщения доступны. Затем приложение может вызвать функцию SQLGetDiagRec для получения этих сообщений. Инструкции Transact-SQL, работающие таким способом, перечислены ниже.

  • DBCC

  • SET SHOWPLAN (доступна в ранних версиях SQL Server)

  • SET STATISTICS

  • PRINT

  • RAISERROR

Драйвер ODBC собственного клиента SQL Server возвращает значение SQL_ERROR для инструкции RAISERROR с уровнем серьезности от 11 и выше. При уровне серьезности RAISERROR от 19 и выше соединение отключается.

Чтобы обработать результирующие наборы инструкции SQL, приложение выполняет следующие действия.

  • Определяет характеристики результирующего набора.

  • Привязывает столбцы к переменным программы.

  • Получает одно значение, целую строку значений, или несколько строк значений.

  • Проверяет наличие результирующих наборов, и в случае их существования, начинает цикл снова для определения характеристик нового результирующего набора.

Процесс получения строк из источника данных и передачи их в приложение называется выборкой.

Получение результирующих наборов инструкций COMPUTE и COMPUTE BY

Предложение COMPUTE BY формирует подытоги внутри результирующего набора. Предложение COMPUTE формирует итоги в конце результирующего набора. Драйвер ODBC собственного клиента SQL Server предоставляет эти итоги и подытоги вызывающему приложению путем создания нескольких результирующих наборов для каждой инструкции SELECT.

Следующий пример использует предложение COMPUTE BY для формирования подытогов и COMPUTE для формирования итогов:

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)

Эти инструкции вызывают вычисление подытогов средней цены и суммы роста для каждого типа книг и выдают общую сумму по данным цены и роста. Драйвер представляет первый результирующий набор строк из книг первого типа. Затем он создает второй результирующий набор с двумя столбцами COMPUTE BY AVG(price) и SUM(advance) для первого набора книг. После этого он формирует третий результирующий набор для следующей группы книг, и четвертый результирующий набор с подытогами COMPUTE BY для этой группы. Драйвер чередует эти результирующие наборы, пока не создаст окончательный результирующий набор с итогами SUM(price) и SUM(advance) для предложения COMPUTE.