Обработка нескольких результирующих наборов при помощи интерфейса IMultipleResults
Применимо: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
azure Synapse Analytics Analytics
Platform System (PDW)
Потребители используют интерфейс IMultipleResults для обработки результатов, возвращенных командой драйвера OLE DB для SQL Server. Когда OLE DB Driver for SQL Server отправляет команду для выполнения, SQL Server выполняет инструкции и возвращает все результаты.
Клиент должен обработать все результаты выполнения команды. Так как команда драйвера OLE DB для SQL Server может формировать в качестве результата несколько объектов набора строк, интерфейс IMultipleResults используется, чтобы приложение гарантированно завершило обмен данными, инициированный клиентом.
Следующая инструкция Transact-SQL формирует несколько наборов строк. При этом одни из них содержат данные строк из таблицы OrderDetails, а другие — результаты предложения COMPUTE BY:
SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,
Discounted = UnitPrice * (1 - Discount) * Quantity
FROM OrderDetails
ORDER BY OrderID
COMPUTE
SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)
BY OrderID
Если потребитель выполняет команду, содержащую этот текст, и запрашивает набор строк в качестве интерфейса возвращаемых результатов, возвращается только первый набор строк. Потребитель может обработать все строки в возвращенном наборе строк. Но если свойство источника данных DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_FALSE, а для соединения не включена функция MARS, в объекте сеанса невозможно будет выполнить ни одну другую команду (драйвер OLE DB для SQL Server не создает другого соединения), пока не будет отменена команда. Если в соединении не включена функция MARS, драйвер OLE DB для SQL Server возвращает ошибку DB_E_OBJECTOPEN, если свойство DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_FALSE, и возвращает E_FAIL, если отсутствует активная транзакция.
Драйвер OLE DB для SQL Server возвратит также DB_E_OBJECTOPEN при использовании потоковых выходных параметров, если приложение не потребило все возвращенные значения параметров вывода перед вызовом метода IMultipleResults::GetResults для получения следующего результирующего набора. Если функция MARS не включена и соединение занято выполнением команды, не предоставляющей набор строк или предоставляющей набор строк, который не является серверным курсором, а свойство источника данных DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_TRUE, драйвер OLE DB для SQL Server создает дополнительные соединения для поддержки параллельных объектов команды при отсутствии активной транзакции. В противном случае возвращается ошибка. Транзакции и блокировка управляются SQL Server на основе каждого подключения. Если создано второе соединение, команда в отдельном соединении не использует общие блокировки. Необходимо соблюдать осторожность и убедиться, что одна команда не блокирует другую, удерживая блокировки строк, запрошенных другой командой. Если включен режим MARS, в одном соединении могут быть активными несколько команд, а если выполняются явные транзакции, все команды совместно используют общую транзакцию.
Потребитель может отменить команду с помощью метода ISSAbort::Abort или освободив все удерживаемые ссылки на объект команды и производный набор строк.
Использование интерфейса IMultipleResults во всех экземплярах позволяет потребителю получить все наборы строк, сформированные командой, и соответствующим образом определить, когда нужно отменить выполнение команды, чтобы освободить объект сеанса для других команд.
Примечание.
При использовании курсоров SQL Server выполнение команд создает курсор. SQL Server возвращает успех или сбой при создании курсора; Таким образом, циклический переход к экземпляру SQL Server завершается после возврата из выполнения команды. Следовательно, каждый вызов GetNextRows становится обменом данными. Таким образом, могут существовать несколько активных объектов команд, каждая из которых обрабатывает набор строк, являющийся результатом выборки из серверного курсора. Дополнительные сведения см. в статье Наборы строк и курсоры SQL Server.