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


Изменение строк при помощи позиционированных операций

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

Позиционированные обновления выполняются в том же соединении, которым был открыт курсор. Это позволяет использовать для изменения данных и для курсора общее пространство транзакций и препятствует блокированию обновлений блокировками, принадлежащими курсору.

Существует два метода для выполнения позиционированных обновлений в курсоре:

  • С помощью предложения Transact-SQL WHERE CURRENT OF для инструкции UPDATE или DELETE.
  • С помощью функции или метода позиционированного обновления из API-интерфейса базы данных, например функции ODBC SQLSetPos.

Выполнение позиционированных обновлений с использованием Transact-SQL

Предложение Transact-SQL WHERE CURRENT OF обычно используется в хранимых процедурах, триггерах и сценариях Transact-SQL, когда изменение данных необходимо осуществлять на основе определенных строк в курсоре. Хранимой процедурой, триггером или сценарием выполняются следующие действия:

  • Объявление и открытие курсора с помощью инструкций DECLARE и OPEN.
  • Использование инструкции FETCH для позиционирования в строке курсора.
  • Выполнение инструкции UPDATE или DELETE с использованием предложения WHERE CURRENT OF. При этом значение cursor_name из инструкции DECLARE используется в качестве значения cursor_name в предложении WHERE CURRENT OF.

Выполнение позиционированных обновлений с использованием API-интерфейсов

Курсоры, созданные с помощью функций и методов OLE DB и ADO, не используются в предложениях WHERE CURRENT OF, поскольку не имеют имен. Однако ODBC поддерживает назначение имени серверному курсору API с использованием функции SQLGetCursorName. Установив атрибуты курсора и открыв курсор путем выполнения инструкции Transact-SQL, используйте функцию SQLGetCursorName, чтобы получить имя для курсора. После позиционирования курсора выполните инструкцию UPDATE или DELETE с предложением WHERE CURRENT OF, в котором содержится ссылка на имя, возвращенное SQLGetCursorName. Но применять этот метод не рекомендуется. Вместо этого лучше использовать функции позиционированного обновления в API-интерфейсе ODBC.

API-интерфейсы баз данных поддерживают два различных метода выполнения позиционированных операций с серверными курсорами API. ODBC поддерживает одну модель, OLE DB и ADO — другую.

В ODBC привяжите столбцы курсора к программным переменным, затем позиционируйтесь в определенной строке курсора. Если выполняется позиционированное обновление, измените значения данных в программных переменных на новые значения. Для выполнения позиционированной операции вызовите функцию SQLSetPos.

Эта функция имеет следующие параметры:

  • SQLSetPos(SQL_POSITION)
    Только для ODBC; позиционирует курсор ODBC в определенной строке в текущем наборе строк.
  • SQLSetPos(SQL_REFRESH)
    Обновляет программные переменные, привязанные к столбцам результирующего набора, присваивая им новые значения из строки, в которой в настоящий момент позиционирован курсор.
  • SQLSetPos(SQL_UPDATE)
    Обновляет текущую строку в курсоре значениями, хранимыми в программных переменных, которые привязаны к столбцам результирующего набора.
  • SQLSetPos(SQL_DELETE)
    Удаляет текущую строку в курсоре.

В OLE DB и ADO для позиционированных обновлений используется другая модель.

В OLE DB при позиционировании в строке внутри набора строк вызовите методы IRowsetChange::SetData или IRowsetChange::DeleteRows для выполнения позиционированных обновлений. Если поставщик OLE DB поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов IRowsetChange, хранятся в кэше до тех пор, пока не будет вызван метод IRowsetUpdate::Update. Если поставщик OLE DB не поддерживает IRowsetUpdate::Update, изменения, сделанные с помощью методов IRowsetChange, вносятся немедленно.

В ADO при позиционировании в строке внутри набора записей вызовите методы Update или Delete объекта Recordset. Если поставщик OLE DB поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов Update или Delete объекта Recordset, хранятся в кэше до тех пор, пока не будет вызван метод UpdateBatch объекта Recordset. Если поставщик OLE DB не поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов Update или Delete объекта IRowsetChange, вносятся немедленно.

См. также

Другие ресурсы

Предложение WHERE (Transact-SQL)
Positioned Updates (ODBC)

Справка и поддержка

Получение помощи по SQL Server 2005