sp_cursor (Transact-SQL)
Запрашивает позиционированные обновления. Эта процедура выполняет операции в одной или нескольких строках буфера выборки курсора. Процедура sp_cursor вызывается указанием ID = 1 в пакете потока табличных данных (TDS).
Синтаксис
sp_cursor
cursor
,
optype
,
rownum
,
table
[ , value[...n]]]
Аргументы
cursor
Дескриптор курсора. Параметр cursor является обязательным и требует входное значение типа int. Параметр cursor содержит дескриптор, формируемый SQL Server и возвращаемый процедурой sp_cursoropen.optype
Обязательный параметр, который определяет операцию, которую будет выполнять курсор. Параметр optype может иметь одно из следующих входных значений типа int.Значение
Имя
Описание
0X0001
UPDATE
Используется для обновления одной или более строк в буфере выборки. К строкам, указанным в параметре rownum, осуществляется повторный доступ, и они обновляются.
0x0002
DELETE
Используется для удаления одной или более строк в буфере выборки. К строкам, указанным в параметре rownum, осуществляется повторный доступ, и они удаляются.
0X0004
INSERT
Вставляет данные без создания инструкции INSERT.
0X0008
REFRESH
Используется для повторного заполнения буфера из базовых таблиц. Может использоваться для обновления строки, если обновление или удаление не удалось провести из-за управления оптимистическим параллелизмом, или после выполнения UPDATE.
0X10
LOCK
SQL Server вызывает для страницы, содержащей указанную строку, U-блокировку. Эта блокировка совместима с S-блокировками и несовместима с X-блокировками или другими U-блокировками. Может использоваться для краткосрочной блокировки.
0X20
SETPOSITION
Используется только в случае, если программа содержит последующую инструкцию SQL Server DELETE или UPDATE.
0X40
ABSOLUTE
Может использоваться только совместно с UPDATE или DELETE. Ключевое слово ABSOLUTE используется только с курсорами KEYSET. Не обрабатывается курсорами DYNAMIC, а курсоры STATIC не допускают обновления.
ПримечаниеЕсли значение ABSOLUTE указано для строки в ключевом наборе, которая не попала в выборку, то операция может не пройти проверку на параллелизм, и правильность возвращаемого результата не гарантируется.rownum
Указывает, с какими строками в буфере выборки будет работать курсор, обновляя или удаляя их.Примечание Не оказывает влияния на точку начала любой операции выборки RELATIVE, NEXT или PREVIOUS, а также на операции обновления и удаления, выполняемые с помощью процедуры sp_cursor.
Параметр rownum является обязательным и требует входного значения типа int.
1
Обозначает первую строку в буфере выборки.2
Обозначает вторую строку в буфере выборки.3, 4, 5
Обозначает третью строку и так далее.n
Обозначает n-ю строку в буфере выборки.0
Обозначает все строки в буфере выборки.Примечание Допускается только в том случае, когда параметр optype имеет значение UPDATE, DELETE, REFRESH или LOCK.
table
Имя таблицы, к которой применяется операция optype , когда определение курсора включает соединение или неоднозначные имена столбцов возвращаются параметром value. Если таблица не назначена, то по умолчанию используется первая таблица в предложении FROM. Параметр table является необязательным и требует строкового входного значения. Строка может быть указана в любом символьном типе данных или Юникоде. Имя таблицы в параметре table может состоять из нескольких частей.value
Используется для вставки или обновления значений. Параметр value используется только со значениями UPDATE и INSERT для типа операции optype. Строка может иметь любой символьный тип данных или Юникоде.Примечание Имена параметров для value могут назначаться пользователем.
Значения кодов возврата
При использовании RPC позиционированная операция DELETE или UPDATE с номером буфера 0 возвращает сообщение DONE со значением rowcount, равным 0 (неудача) или 1 (успех) для каждой строки в буфере выборки.
Замечания
Параметр optype
Кроме сочетаний SETPOSITION с UPDATE, DELETE, REFRESH или LOCK, а также ABSOLUTE с UPDATE или DELETE, значения optype взаимно исключают друг друга.
Предложение SET значения UPDATE конструируется из параметра value.
Одно из преимуществ использования значения INSERT optype состоит в том, что не надо преобразовывать несимвольные данные в символьный формат для вставки. Значения указываются так же, как в UPDATE. Если какие-либо обязательные столбцы не включены, то возникает ошибка INSERT.
Значение SETPOSITION не влияет на начальную точку любой операции выборки RELATIVE, NEXT или PREVIOUS, так же как и любые обновления или удаления, выполненные с помощью интерфейса sp_cursor. Любое число, не указывающее строку в буфере выборки, приведет к установке позиции в значения 1, при этом сообщение об ошибке не выдается. После выполнения инструкции SETPOSITION позиция действует до выполнения следующей операции sp_cursorfetch, операции Transact-SQL FETCH или операции sp_cursor SETPOSITION на том же курсоре. Последующая операция sp_cursorfetch переместит позицию курсора на первую строку в новом буфере выборки, тогда как другие вызовы курсора не повлияют на позицию. SETPOSITION можно связывать оператором OR с REFRESH, UPDATE, DELETE или LOCK, чтобы установить значение позиции на последнюю измененную строку.
Если строка в буфере выборки не указана в параметре rownum, то позиция будет установлена в значение 1, а сообщение об ошибке не возвращается. После задания позиции она действует до выполнения следующей операции sp_cursorfetch, операции Transact-SQL или операции sp_cursor SETPOSITION на том же курсоре.
SETPOSITION можно связывать оператором OR с REFRESH, UPDATE, DELETE или LOCK, чтобы установить позицию курсора на последнюю измененную строку.
Параметр rownum
Если он указан, то параметр rownum может интерпретироваться как номер строки в наборе ключей, а не номер строки в буфере выборки. Пользователь отвечает за управление параллелизмом. Это означает, что для курсоров SCROLL_LOCKS придется независимо поддерживать блокировку заданной строки (это можно сделать через транзакции). Для курсоров OPTIMISTIC надо предварительно извлечь строку, чтобы выполнить эту операцию.
Параметр table
Если значение optype равно UPDATE или INSERT, то полная инструкция обновления или вставки подставляется в качестве параметра value, а указанное для table значение не используется.
Примечание |
---|
Для представлений могут изменяться только участвующие в них таблицы. Имена столбцов параметра value должны отражать имена столбцов представления, но именем таблицы может быть имя базовой таблицы (в этом случае sp_cursor заменит имя представления). |
Параметр value
Имеются две альтернативы правилам использования параметра value, изложенным ранее в разделе «Аргументы».
Можно использовать имя через символ @ перед именем столбца в списке выбора для любых именованных параметров value. Одним из преимуществ такого варианта является то, что не обязательно преобразовывать данные.
Использовать параметр для передачи полной инструкции UPDATE или INSERT или использовать несколько параметров для передачи частей инструкций UPDATE или INSERT, из которых потом SQL Server построит полную инструкцию. Примеры можно найти далее в подразделе «Примеры» этого раздела.
Примеры
Альтернативы использованию параметра value
Для UPDATE:
Когда используется один параметр, инструкцию UPDATE можно передать с использованием следующего синтаксиса:
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,…n]
Примечание |
---|
Если указана инструкция UPDATE <имя таблицы>, то любое указанное для параметра table значение не будет использоваться. |
При использовании нескольких параметров первый параметр должен быть строкой в следующем формате:
[ SET ] <column name> = expression [,...n]
Последующие параметры должны быть в формате:
<column name> = expression [,...n]
В этом случае <имя таблицы> в конструируемой инструкции обновления — это имя, указанное или применяемое по умолчанию для параметра table.
Для INSERT:
Если используется один параметр, то инструкцию INSERT можно передать с использованием следующего синтаксиса:
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )
Примечание |
---|
Если указана инструкция INSERT<имя таблицы>, то любое указанное для параметра table значение не будет использоваться. |
При использовании нескольких параметров первый параметр должен быть строкой в следующем формате:
[ VALUES ( ] <expression> [,...n]
Последующие параметры должны быть в формате:
expression [,...n]
За исключением случаев, когда указан параметр VALUES, в этом случае после последнего выражения должен стоять символ ). В этом случае <имя таблицы> в конструируемой инструкции UDPATE — это имя, указанное или применяемое по умолчанию для параметра table.
Примечание |
---|
Возможно передать один параметр как именованный, то есть «@VALUES». В этом случае другие параметры использовать нельзя. |
См. также