sp_cursor (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

        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, изложенным ранее в разделе «Аргументы».

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

  2. Использовать параметр для передачи полной инструкции 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». В этом случае другие параметры использовать нельзя.