Поделиться через


sp_cursor (Transact-SQL)

Область применения: SQL Server

Запрашивает позиционированные обновления. Эта процедура выполняет операции с одной или несколькими строками в пределах буфера выборки курсора. sp_cursor вызывается путем ID = 1 указания в пакете табличного потока данных (TDS).

Соглашения о синтаксисе Transact-SQL

Синтаксис

sp_cursor cursor , optype , rownum , table
    [ , value [ ...n ] ]
[ ; ]

Аргументы

курсор

Дескриптор курсора. Параметр курсора является int и не может бытьNULL. Этот параметр представляет собой значение, созданное handle ядро СУБД и возвращаемое процедуройsp_cursoropen.

optype

Обязательный параметр, указывающий, какая операция выполняет курсор. Для параметра optype требуется одно из следующих значений.

Значение Имя Описание
0X0001 UPDATE Используется для обновления одной или более строк в буфере выборки. Строки, указанные в rownum , обновляются и обновляются.
0x0002 DELETE Используется для удаления одной или более строк в буфере выборки. Строки, указанные в rownum , будут повторно доступны и удалены.
0X0004 INSERT Вставляет данные без создания инструкции INSERT .
0X0008 REFRESH Используется для повторного заполнения буфера из базовых таблиц и может использоваться для обновления строки, если обновление или удаление завершается ошибкой из-за оптимистического элемента управления параллелизмом или после нее UPDATE.
0X10 LOCK Приводит к получению блокировки обновления (U) на странице, содержащей указанную строку. Эта блокировка совместима с общими блокировками (S), но не с эксклюзивными блокировками (X) или другими блокировками обновлений. Может использоваться для краткосрочной блокировки.
0X20 SETPOSITION Используется только в том случае, если программа будет выдавать последующие DELETE инструкции или UPDATE инструкции.
0X40 ABSOLUTE Можно использовать только с UPDATE или DELETE. ABSOLUTE используется только с KEYSET курсорами (игнорируется для DYNAMIC курсоров), а STATIC курсоры не могут быть обновлены.

Примечание. Если ABSOLUTE указана строка в наборе ключей, который не был извлечен, операция может завершиться ошибкой проверки параллелизма и результат возврата не может быть гарантирован.

rownum

Указывает, какие строки в буфере получения курсор работает, обновляется или удаляется. Этот параметр не влияет на начальную точку любой операции , NEXTили PREVIOUS получения, ни каких-либо RELATIVEобновлений или удалений, выполненных с помощьюsp_cursor.

rownum — это обязательный параметр, вызывающий входное значение int .

  • 1

    Обозначает первую строку в буфере выборки.

  • 2, 3, 4, ...n

    Обозначает вторую, третью и четвертую строку и т. д.

  • 0

    Обозначает все строки в буфере выборки.

Этот параметр действителен только для использования со значениями UPDATEoptype или LOCK optypeDELETEREFRESH.

table

Имя таблицы, определяющей таблицу, к которую применяется оптип , когда определение курсора включает соединение или неоднозначные имена столбцов возвращаются параметром значения . Если определенная таблица не указана, по умолчанию используется первая таблица в предложении FROM . Параметр таблицы является необязательным и требует строкового входного значения. Строка может быть указана как любой символ или тип данных Юникода или имя таблицы с несколькими частьми.

значение

Используется для вставки или обновления значений. Параметр строки значения используется только со значениями UPDATE optype.INSERT Строка может иметь любой символьный тип данных или UNICODE.

Имена параметров для значения могут быть назначены пользователем.

Значения кода возврата

0 (успешно) или 1 (сбой).

Замечания

Параметр optype

За исключением сочетаний SETPOSITION с UPDATE, DELETEREFRESHили LOCKс ABSOLUTE или с UPDATE DELETEзначениями оптипа, являются взаимоисключающими.

Предложение SET UPDATE значения создается из параметра значения .

Одним из преимуществ использования INSERT <optype> значения является то, что вы можете избежать преобразования данных, отличных от символов, в формат символов для вставок. Значения задаются таким же образом, как UPDATEи . Если какие-либо обязательные столбцы не включены, происходит сбой INSERT .

  • Значение SETPOSITION не влияет на начальную точку любой RELATIVEоперации , NEXTа также PREVIOUS не выполняет никаких обновлений или удалений sp_cursor , выполняемых с помощью интерфейса. Любое число, не указывающее строку в буфере получения, приводит к тому, что позиция задана 1без возврата ошибки. После SETPOSITION выполнения позиция остается в силе до следующей sp_cursorfetch операции, операции T-SQL FETCH или sp_cursor SETPOSITION операции через тот же курсор. Следующая sp_cursorfetch операция задает положение курсора первой строке в новом буфере получения, а другие вызовы курсора не влияют на значение позиции. SETPOSITIONМожет быть связана предложением OR с REFRESH, UPDATEDELETEилиLOCK, чтобы задать значение позиции последней измененной строке.

Если строка в буфере получения не указана с помощью параметра rownum , позиция имеет значение 1, при этом ошибка не возвращается. После установки позиции он остается в силе до следующей sp_cursorfetch операции, операции T-SQL FETCH или sp_cursor SETPOSITION операции на том же курсоре.

SETPOSITIONможно связать предложение с REFRESHпредложением OR , UPDATEDELETEили LOCK задать положение курсора в последней измененной строке.

Параметр rownum

Если задано, параметр rownum можно интерпретировать как номер строки в наборе ключей вместо номера строки в буфере получения. Пользователь отвечает за управление параллелизмом. Это означает, что для SCROLL_LOCKS курсоров необходимо независимо поддерживать блокировку заданной строки (которая может выполняться с помощью транзакции). Для OPTIMISTIC курсоров необходимо ранее получить строку для выполнения этой операции.

Параметр таблицы

Если значение optype равно UPDATE или INSERT полное обновление или инструкция insert отправляется в качестве параметра значения, значение, указанное для таблицы, игнорируется.

Примечание.

В отношении представлений может быть изменена только одна таблица, участвующая в представлении. Имена столбцов параметров значения должны отражать имена столбцов в представлении, но имя таблицы может быть базовой таблицей (в этом случае sp_cursor заменяет имя представления).

Параметр значения

Существует два варианта правил использования значения , как указано ранее в разделе "Аргументы":

  1. Имя столбца @ в списке выбора можно использовать для любых именованных параметров значения . Одним из преимуществ этой альтернативы является то, что преобразование данных может не потребоваться.

  2. Используйте параметр для отправки полной UPDATE или инструкции или INSERT использования нескольких UPDATE параметров для отправки частей или INSERT инструкции, которые ядро СУБД затем встраивает в полную инструкцию. Примеры можно найти в разделе "Примеры" далее в этой статье.

Примеры

Альтернативный параметр значения используется

Обновление

При использовании UPDATE одного параметра оператор может быть отправлен с помощью следующего синтаксиса:

[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]

Если UPDATE <table_name> задано, любое значение, указанное для параметра таблицы , игнорируется.

При использовании нескольких параметров первый параметр должен быть строкой в следующем формате:

[ SET ] <column name> = expression [ , ...n ]

Последующие параметры должны находиться в виде следующих параметров:

<column name> = expression [ , ...n ]

В этом случае <table_name> в созданной инструкции обновления используется один из указанных или по умолчанию параметров таблицы .

Для INSERT

При использовании INSERT одного параметра оператор может быть отправлен с помощью следующего синтаксиса:

[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )

Если INSERT <table_name> задано, любое значение, указанное для параметра таблицы , игнорируется.

При использовании нескольких параметров первый параметр должен быть строкой в следующем формате:

[ VALUES ] ( <expression> [ , ...n ] )

Последующие параметры должны быть в виде expression [ , ...n ], за исключением того, где VALUES был указан, в этом случае должен быть конечный после ) последнего выражения. В этом случае <table_name> в созданной UPDATE инструкции используется один из указанных или по умолчанию параметров таблицы .

Примечание.

Например, @valuesможно отправить один параметр в качестве именованного параметра. В этом случае другие именованные параметры не могут использоваться.