Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 output from update  [new]
letefon
Member

Откуда:
Сообщений: 128
всем привет!
вот скрипт для примера (MS SQL 2000):
create table tmp1 (f int)
create table tmp2 (fNew int, fOLD int)

insert into tmp1 (f)
select 1
union select 2

update tmp1 set f = f*10
output deleted.f, inserted.f
into tmp2 (fNew, fOLD) where f = 2

select * from tmp1 
select * from tmp2

drop table tmp1
drop table tmp2
Может ли подобных случаях по разной причине в таблицу tmp2 не вставиться записи, но при этом записи в tmp1 будут обновлены? т.е. будут ли выполняться эти запросы как в одной транзакции, либо все, либо ничего? у меня смоделировать ситуацию, когда выполняется только что-то одно не получилось.
27 окт 09, 13:36    [7844195]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
letefon,

в SQL2000 в UPDATE никакого OUTPUT не бывает!
27 окт 09, 13:40    [7844234]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Какой ещё такой output в 2000?

Сообщение было отредактировано: 27 окт 09, 13:41
27 окт 09, 13:41    [7844237]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
letefon
Member

Откуда:
Сообщений: 128
опечатался :) 2005
27 окт 09, 13:44    [7844283]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
letefon
опечатался :) 2005
Фигасе опечаДка!

Сообщение было отредактировано: 27 окт 09, 13:46
27 окт 09, 13:46    [7844289]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
letefon
будут ли выполняться эти запросы как в одной транзакции, либо все, либо ничего? у меня смоделировать ситуацию, когда выполняется только что-то одно не получилось.
У Вас написана одна-единственная команда.
Одна команда всегда выполняется в неявной транзакции, если транзакция не открыта явно.
27 окт 09, 13:50    [7844334]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
letefon
Member

Откуда:
Сообщений: 128
tpg,

у меня все серверы 2000, и только один 2005
27 окт 09, 13:51    [7844341]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
letefon
Member

Откуда:
Сообщений: 128
iap,

если не трудно, то выдержку из бола можно?
27 окт 09, 13:52    [7844361]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
letefon
iap,

если не трудно, то выдержку из бола можно?
Транзакции (Transact-SQL)
Автоматическое принятие транзакций
Каждая отдельная инструкция является транзакцией.
27 окт 09, 14:02    [7844463]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31219
letefon
Может ли подобных случаях по разной причине в таблицу tmp2 не вставиться записи, но при этом записи в tmp1 будут обновлены? т.е. будут ли выполняться эти запросы как в одной транзакции, либо все, либо ничего? у меня смоделировать ситуацию, когда выполняется только что-то одно не получилось.
В принципе может (см. примечание), но у меня не получилось.
27 окт 09, 14:07    [7844502]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В принципе может (см. примечание

вы про это?

Инструкция UPDATE, INSERT или DELETE с предложением OUTPUT возвращает строки клиенту даже в случае, если при
выполнении инструкции возникли ошибки и был выполнен ее откат


вернуть строки клиенту и вставить в таблицу - это все-таки немного разные вещи.

Posted via ActualForum NNTP Server 1.4

27 окт 09, 14:10    [7844530]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31219
alexeyvg
letefon
Может ли подобных случаях по разной причине в таблицу tmp2 не вставиться записи, но при этом записи в tmp1 будут обновлены? т.е. будут ли выполняться эти запросы как в одной транзакции, либо все, либо ничего? у меня смоделировать ситуацию, когда выполняется только что-то одно не получилось.
В принципе может (см. примечание), но у меня не получилось.
А, вот так получилось:
create table tmp1 (f tinyint)
create table tmp2 (fNew int, fOLD int)
go
insert into tmp1 (f)
select 1
union select 2

update tmp1 set f = case when f = 1 then f else -f end
output deleted.f, inserted.f
--into tmp2 (fNew, fOLD)
go
select * from tmp1 
select * from tmp2
go
drop table tmp1
drop table tmp2
output выдаёт якобы изменённую строку, при этом реально данные не изменяются.

Однако, если расскоментировать into tmp2 (fNew, fOLD), этот эффект исчезает.

В общем, резюмируя: достаточно, в соответствии с BOL, проверять наличие ошибок, и гарантия есть.
27 окт 09, 14:13    [7844552]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31219
daw
вернуть строки клиенту и вставить в таблицу - это все-таки немного разные вещи.
Да, согласен - транзакция всё равно всё откатит.
27 окт 09, 14:14    [7844562]     Ответить | Цитировать Сообщить модератору
 Re: output from update  [new]
letefon
Member

Откуда:
Сообщений: 128
вот выдержка:
Вставка в таблицу данных, которые были возвращены предложением OUTPUT

При сборе результатов предложения OUTPUT во вложенных инструкциях INSERT, UPDATE, DELETE или MERGE и вставки этих результатов в целевую таблицу или представление необходимо учитывать следующее.

* Вся операция является атомарной. Или инструкция INSERT выполняется вместе с вложенной инструкцией DML, содержащей предложение OUTPUT, или выполнение всей инструкции завершается с ошибкой.

Всем спасибо
27 окт 09, 14:17    [7844590]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить