16.1.23

Использование оператора OUTPUT для отслеживания изменений DML

http://blogs.technet.com/lyudmila_fokina/archive/2007/06/23/output-dml.aspx

Людмила Фокина

Знаете ли вы, что… Вы можете отслеживать изменения данных без использования триггеров: В SQL Server 2005 оператор OUTPUT является частью синтаксиса DML предложений.

Например:

INSERT

    [ TOP ( expression ) [ PERCENT ] ]

    [ INTO ]

    { <object> | rowset_function_limited

      [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]

    }

{

    [ ( column_list ) ]

    [ <OUTPUT Clause> ]

    { VALUES ( ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] )

    | derived_table

    | execute_statement

    | <dml_table_source>

    | DEFAULT VALUES

    }

}

Оператор OUTPUT может сохранять результирующее множество строк затронутых DML оператором в таблицу или переменную типа таблица.

Например, сохранить все добавленные (или удаленные) строки.

Функционально это похоже на промежуточные таблицы INSERTED и DELETED, используемые триггерами.

Пример:

--Создадим таблицу Address

Create Table Address (ProductID Int, SupplierID Int, Address Varchar(255))

--Вставим данные в таблицу

Insert into Address Values (234,567,'1234 One SQL Way, Microsoft City, U.S.')

Insert into Address Values (345,678,'1234 One Windows Way, Microsoft City, WA')

--Объявим табличную переменную

Declare @Recordchanges table (change Varchar(255))

--Обновим данные в таблице

Update Address

Set Address=reverse(address)

--Запишем изменения в табличную переменную

OUTPUT 'Изначальные данные:' + DELETED.Address+' изменены на: '+ INSERTED.Address+'' into @RecordChanges

--Читаем изменения из табличной переменной

Select * from @RecordChanges

 

На выходе имеем:

Change

------------------------

Изначальные данные:'1234 One SQL Way, Microsoft City, U.S.' has been изменены на: '.S.U ,ytiC tfosorciM ,yaW LQS enO 4321'

Изначальные данные:'1234 One Windows Way, Microsoft City, WA' has been изменены на: 'AW ,ytiC tfosorciM ,yaW swodniW enO 4321'

Комментариев нет:

Отправить комментарий