Наборы строк и курсоры SQL Server
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
SQL Server возвращает результирующие наборы потребителям с помощью двух методов:
Результирующие наборы по умолчанию, которые характеризуются следующим:
Сводят издержки к минимуму.
Обеспечивают максимальную производительность при выборке данных.
Поддерживают лишь функции однопроходных курсоров только для чтения.
Возвращают пользователю по одной строке одновременно.
Поддерживают одновременно только одну активную инструкцию в каждом соединении.
После выполнения инструкции другие инструкции можно будет выполнить в этом соединении только после извлечения пользователем всех результатов или отмены этой инструкции.
Поддерживают все инструкции Transact-SQL.
Серверные курсоры, которые характеризуются следующим:
Поддерживают все функции курсоров.
Могут возвращать пользователю блоки строк.
Поддерживают несколько активных инструкций в одном соединении.
Позволяют выбирать наиболее применимые функциональные средства курсора с точки зрения производительности.
Поддержка функциональных средств курсора может привести к снижению производительности по отношению к результирующему набору по умолчанию. Это снижение производительности можно скомпенсировать, если пользователь имеет возможность применять функциональные средства курсоров для извлечения набора строк меньшего размера.
Не поддерживают инструкции Transact-SQL, которые возвращают несколько результирующих наборов.
Пользователь может запросить другой режим работы курсоров, установив определенные свойства набора строк. Если пользователь не задает ни одного из этих свойств набора строк или задает для них всех значения по умолчанию, то драйвер OLE DB для SQL Server реализует набор строк с помощью результирующего набора по умолчанию. Если любому из этих свойств присвоено значение, отличное от применяемого по умолчанию, то драйвер OLE DB для SQL Server реализует набор строк с помощью серверного курсора.
Следующие свойства набора строк направляют драйвер OLE DB для SQL Server для использования курсоров SQL Server. Некоторые свойства можно безопасно сочетать с другими. Например, набор строк, предоставляющий доступ к свойствам DBPROP_IRowsetScroll и DBPROP_IRowsetChange, становится набором строк с закладками, обеспечивающим возможность немедленного обновления. Другие свойства являются взаимоисключающими. Например, набор строк со свойством DBPROP_OTHERINSERT не может содержать закладок.
Идентификатор свойства | Значение | Поведение набора строк |
---|---|---|
DBPROP_SERVERCURSOR | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_CANSCROLLBACKWARDS или DBPROP_CANFETCHBACKWARDS | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_BOOKMARKS или DBPROP_LITERALBOOKMARKS | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_OWNUPDATEDELETE, DBPROP_OWNINSERT или DBPROP_OTHERUPDATEDELETE | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_OTHERINSERT | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может включать предложение ORDER BY, если для указанных в ссылке столбцов существует индекс. Если набор строк содержит закладки, свойство DBPROP_OTHERINSERT не может иметь значение VARIANT_TRUE. При попытке создать набор строк с этим свойством видимости и закладками возникает ошибка. |
DBPROP_IRowsetLocate или DBPROP_IRowsetScroll | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. В наборе строк поддерживаются закладки и абсолютное позиционирование с помощью интерфейса IRowsetLocate. Текст команды может содержать предложение ORDER BY. Свойства DBPROP_IRowsetLocate и DBPROP_IRowsetScroll требуют наличия закладок в наборе строк. При попытке создать набор строк с закладками и свойством DBPROP_OTHERINSERT, которому присвоено значение VARIANT_TRUE, возникает ошибка. |
DBPROP_IRowsetChange или DBPROP_IRowsetUpdate | VARIANT_TRUE | Может обновлять данные SQL Server с помощью набора строк. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Все команды, поддерживающие обновляемые курсоры, могут поддерживать эти интерфейсы. |
DBPROP_IRowsetLocate или DBPROP_IRowsetScroll и DBPROP_IRowsetChange или DBPROP_IRowsetUpdate | VARIANT_TRUE | Может обновлять данные SQL Server с помощью набора строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. В наборе строк поддерживаются закладки и абсолютное позиционирование с помощью интерфейса IRowsetLocate. Текст команды может содержать предложение ORDER BY. |
DBPROP_IMMOBILEROWS | VARIANT_FALSE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает только прямую прокрутку. Относительное позиционирование строки поддерживается. Текст команды может включать предложение ORDER BY, если для указанных в ссылке столбцов существует индекс. DBPROP_IMMOBILEROWS доступен только в наборах строк, которые могут отображать строки SQL Server, вставленные командами в других сеансах или другими пользователями. При попытке открыть набор строк с этим свойством, заданным равным VARIANT_FALSE, для любого набора строк, для которого свойство DBPROP_OTHERINSERT не может иметь значение VARIANT_TRUE, возникает ошибка. |
DBPROP_REMOVEDELETED | VARIANT_TRUE | Не удается обновить данные SQL Server через набор строк. Этот набор строк поддерживает только прямую прокрутку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY, если это не запрещено другим свойством. |
Набор строк OLE DB для SQL Server, поддерживаемый курсором сервера, можно легко создать в базовой таблице ИЛИ представлении SQL Server с помощью метода IOpenRowset::OpenRowset . Укажите таблицу или представление по имени, передав требуемые наборы свойств набора строк в параметре rgPropertySets.
Если пользователь требует, чтобы набор строк поддерживался серверным курсором, то возможности выбора текста команды, которая создает набор строк, становятся ограниченными. В частности, текст команды ограничивается применением либо одной инструкции SELECT, которая возвращает один результирующий набор строк, либо хранимой процедуры, реализующей одну инструкцию SELECT, которая возвращает результат в виде одного набора строк.
В двух этих таблицах показаны сопоставления различных свойств OLE DB и моделей курсоров. В них также показано, какие свойства набора строк следует задать, чтобы использовать модель курсора определенного типа.
В каждой ячейке таблицы содержится значение свойства набора строк для определенной модели курсора. Типы данных всех свойств наборов строк, приведенных выше в этом разделе, относятся к типу данных VT_BOOL, а их значением по умолчанию является VARIANT_FALSE. В таблице используются следующие символы:
F = значение по умолчанию (VARIANT_FALSE)
T = VARIANT_TRUE
- = VARIANT_TRUE или VARIANT_FALSE
Чтобы ввести в действие модель курсора определенного типа, определите столбец, соответствующий этой модели курсора, и найдите все свойства набора строк со значением «Т» в этом столбце. Чтобы воспользоваться данной конкретной моделью курсора, присвойте этим свойствам набора строк значение VARIANT_TRUE. Свойствам набора строк, для которых в качестве значения указано «-», можно присваивать либо значение VARIANT_TRUE, либо значение VARIANT_FALSE.
Свойства набора строк и модели курсора | По умолчанию. result set (RO) |
Быстро однопроходный только (RO) |
Статические (RO) |
Keyset управляемый (RO) |
---|---|---|---|---|
DBPROP_SERVERCURSOR | F | T | T | T |
DBPROP_DEFERRED | F | F | - | - |
DBPROP_IrowsetChange | F | F | F | F |
DBPROP_IrowsetLocate | F | F | - | - |
DBPROP_IrowsetScroll | F | F | - | - |
DBPROP_IrowsetUpdate | F | F | F | F |
DBPROP_BOOKMARKS | F | F | - | - |
DBPROP_CANFETCHBACKWARDS | F | F | - | - |
DBPROP_CANSRCOLLBACKWARDS | F | F | - | - |
DBPROP_CANHOLDROWS | F | F | - | - |
DBPROP_LITERALBOOKMARKS | F | F | - | - |
DBPROP_OTHERINSERT | F | T | F | F |
DBPROP_OTHERUPDATEDELETE | F | T | F | T |
DBPROP_OWNINSERT | F | T | F | T |
DBPROP_OWNUPDATEDELETE | F | T | F | T |
DBPROP_QUICKSTART | F | F | - | - |
DBPROP_REMOVEDELETED | F | F | F | - |
DBPROP_IrowsetResynch | F | F | F | - |
DBPROP_CHANGEINSERTEDROWS | F | F | F | F |
DBPROP_SERVERDATAONINSERT | F | F | F | - |
DBPROP_UNIQUEROWS | - | F | F | F |
DBPROP_IMMOBILEROWS | - | - | - | T |
Свойства набора строк и модели курсора | Динамический (только для чтения) | С набором ключей (для чтения и записи) | Динамический (для чтения и записи) |
---|---|---|---|
DBPROP_SERVERCURSOR | T | T | T |
DBPROP_DEFERRED | - | - | - |
DBPROP_IrowsetChange | F | - | - |
DBPROP_IrowsetLocate | F | - | F |
DBPROP_IrowsetScroll | F | - | F |
DBPROP_IrowsetUpdate | F | - | - |
DBPROP_BOOKMARKS | F | - | F |
DBPROP_CANFETCHBACKWARDS | - | - | - |
DBPROP_CANSRCOLLBACKWARDS | - | - | - |
DBPROP_CANHOLDROWS | F | - | F |
DBPROP_LITERALBOOKMARKS | F | - | F |
DBPROP_OTHERINSERT | T | F | T |
DBPROP_OTHERUPDATEDELETE | T | T | T |
DBPROP_OWNINSERT | T | T | T |
DBPROP_OWNUPDATEDELETE | T | T | T |
DBPROP_QUICKSTART | - | - | - |
DBPROP_REMOVEDELETED | T | - | T |
DBPROP_IrowsetResynch | - | - | - |
DBPROP_CHANGEINSERTEDROWS | F | - | F |
DBPROP_SERVERDATAONINSERT | F | - | F |
DBPROP_UNIQUEROWS | F | F | F |
DBPROP_IMMOBILEROWS | F | T | F |
Выбор модели курсора для конкретного ряда свойств набора строк определяется следующим образом.
Получите подмножество свойств, приведенных в предыдущих таблицах, из указанной коллекции свойств набора строк. В зависимости от значения флага для каждого свойства набора строк разделите эти свойства на две подгруппы — обязательные (T, F) и необязательные (-). Для каждой модели курсора начните с первой таблицы и перемещайтесь слева направо. Сравните значения свойств в этих двух подгруппах со значениями соответствующих свойств в этом столбце. Выбирается та модель курсора, для которой все обязательные свойства совпадают, а число несовпадений в необязательных свойствах минимально. При наличии нескольких моделей курсора выбирается самая левая.
Размер блока курсора SQL Server
Если курсор SQL Server поддерживает набор строк OLE DB Driver for SQL Server, количество элементов в параметре массива строк iRowset::GetNextRows или методы IRowsetLocate::GetRowsAt определяют размер блока курсора. Строки, указанные дескрипторами в массиве, являются элементами блока курсора.
Что касается наборов строк, поддерживающих закладки, то элементы блока курсора определяются дескрипторами строк, которые извлекаются с помощью метода IRowsetLocate::GetRowsByBookmark.
Независимо от метода, используемого для заполнения набора строк и формирования блока курсора SQL Server, блок курсора активен, пока следующий метод извлечения строк не будет выполнен в наборе строк.