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

Откуда: Томск.
Сообщений: 282
Здравствуйте, у меня есть такой запрос.
Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID 

Однако может произойти обновление, а может и не произойти, если не выполниться условие where. Как мне узнать было обновление или нет?
Спасибо.
8 авг 03, 08:16    [292853]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
БД и так возвращает клиенту кол-во обновленных записей( так же как и удаленных/вставленных и т.д.) если только вы не установили SET NOCOUNT ON для всего сервера
8 авг 03, 08:19    [292856]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Мне надо в хранимой процедуре знать, было или нет обновление.

ALTER PROCEDURE dbo.GetPatData

(
@IdPat varchar(39)
)
AS
Declare @table_name varchar(38)
Declare @SQL varchar(500)

Declare @s_PatVal varchar(500)
Declare @n_PatVal int
Declare @PatID varchar(39)
Declare @AtribID varchar(39)
Declare @ClassID varchar(39)
Declare @AtribName varchar(50)
Declare @AtribType varchar(7)
Declare @u_AtribID uniqueidentifier

SET NOCOUNT ON

Declare Info CURSOR FOR SELECT Class_ID FROM Pat where ID = @IdPat
OPEN Info
FETCH NEXT FROM Info
INTO @ClassID
DEALLOCATE Info

Set @table_name = 'CLASS'
Set @table_name = @table_name + SUBSTRING(@ClassID,2,8)
Set @table_name = @table_name + SUBSTRING(@ClassID,11,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,16,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,21,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,26,12)

SET NOCOUNT ON
create table #Tempinfo(ID varchar(39), Val varchar(500), AtrID varchar(39),type varchar(7), AtrName varchar(50))

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


insert into #Tempinfo (ID, Val, AtrID) SELECT ID, Val, AtrID FROM char500 where ID = @IdPat

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


insert into #Tempinfo (ID, Val, AtrID) SELECT ID, Val, AtrID FROM integ where ID = @IdPat

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

Set @SQL = 'Declare Info CURSOR FOR SELECT * FROM '+@table_name
exec(@SQL)
OPEN Info
FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType

WHILE @@FETCH_STATUS = 0
BEGIN
Set @u_AtribID = cast(@AtribID as uniqueidentifier)

Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID
[color=red]ВОТ ТУТ НАДО ЗНАТЬ, ОБНОВИЛИСЬ ИЛИ НЕТ![/color] FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType
END
CLOSE info
DEALLOCATE Info

--Update #Tempinfo set (type, AtrName) select type, names where AtrID = @u_AtribID


SET NOCOUNT OFF
select * from #Tempinfo

RETURN
8 авг 03, 08:31    [292865]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Перед обновлением проверь, существуют ли записи с условием where. Если да и транзакция не откатилась, значит обновления прошли.
8 авг 03, 08:33    [292867]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
товагищи! а @@ROWCOUNT не всегда говорит, сколько записей проапдейтилось?
8 авг 03, 08:36    [292872]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
В приведенном коде достаточно одного SET NOCOUNT ON и совершенно не нужен SET NOCOUNT OFF в том месте, где он стоит. Если он так уж нужен, то поставь после последнего селекта.
8 авг 03, 08:36    [292873]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Перед обновлением проверь, существуют ли записи с условием where. Если да
и транзакция не откатилась, значит обновления прошли.

Как это сделать?
8 авг 03, 08:43    [292875]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
ну, проверить так можно:

declare @Has int

select @Has = count(*) from #Tempinfo where AtrID = @u_AtribID
if @Has > 0
Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID


Ну а как же таки с @@RowCount


Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID
if @@ROWCOUNT = 0 PRINT 'Нету нифига' ELSE Print 'Есть обновлённые'

не всегда сработает?!!
8 авг 03, 08:48    [292878]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Большое спасибо, спасибо!
8 авг 03, 08:55    [292886]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Проверку на существование записей можно и попроще слепить. Так, например:
if exists(select 1 from #Tempinfo where AtrID = @u_AtribID) 

Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID
8 авг 03, 09:03    [292892]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
У меня с @@RowCount кажется получилось.
8 авг 03, 09:05    [292895]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Для тех, кто сомневается в работоспособности @@ROWCOUNT вот цитата из BOL:

The @@ROWCOUNT function is updated even when SET NOCOUNT is ON.
8 авг 03, 09:05    [292896]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
зачем тогда проверять наличие строк? в этом есть смысл?
8 авг 03, 09:16    [292908]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
andsm
Member

Откуда: Москва
Сообщений: 1319
Блог
Если @@rowcount>0, это не всегда означает что обновление прошло. Если на обновлямой таблице есть триггер - то чаще всего @@rowcount вообще не несет какго-либо смысла. Однако если триггера нет, то определение прошел ли update по @@rowcount будет работать.
8 авг 03, 09:26    [292918]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
andsm: действительно. всё предельно ясно. 10х.
8 авг 03, 09:30    [292922]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Да такой смысл есть.

Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID 

if @@ROWCOUNT = 0
BEGIN
insert into #Tempinfo (type, AtrName) values (@AtribType, @AtribName)
END
8 авг 03, 09:30    [292924]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать произошел update или нет.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
да я не про это. про смысл проверки, это я так спрашивал, есть ли разница между проверкой вначале селектом, а затем апдейт ПРОТИВ проверки после апдейта @@rowcount.
8 авг 03, 09:39    [292935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить