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

Откуда:
Сообщений: 49
Здравствуйте
Вопрос по транзакциям:
Может ли Begin Transaction отлавливать неправильный апдейт?
например:

Begin Transaction vc@@ERROR
select '1'
--  if isnull(@@ERROR,0)<>0
	begin
	declare @vc int
			,@er int,@str varchar(300)
	select @str=''

	UPDATE l SET l.vcode='q' FROM Logs l where l.PCODE=7
	Set @er = @@ERROR
	end
select '2'
  if isnull(@er,0)<>0
	BEGIN
	Rollback Transaction TranExcp__2000_@@Error
    -- показать специальное сообщение об ошибке
    select @str='Ошибка'
	end
select '3'
 If isnull(@er,0) = 0
	Begin
    Commit Transaction vc@@ERROR
	End

SELECT @str,@er


выдаёт ошибку:
Msg 245, Level 16, State 1, Line 13
Conversion failed when converting the varchar value 'q' to data type int.


Таблица создавалась вот так:
CREATE TABLE [dbo].[Logs](
	[PCODE] [int] NULL,
	[Messange] [varchar](100) NULL,
	[TDOCDoc] [varchar](3) NULL,
	[WUSER] [varchar](30) NULL,
	[WDATE] [datetime] NULL,
	[VCODE] [int] NOT NULL,
	[WHost] [varchar](100) NULL,
 CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED 
(
	[VCODE] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
26 июн 15, 11:22    [17819183]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
_djХомяГ
Guest
Вопрос крайне непонятный
@@Error
Возвращает номер ошибки, если в предыдущей инструкции возникла ошибка. Если ошибка относится к представлению каталога sys.messages, @@ERROR содержит значение столбца sys.messages.message_id для этой ошибки. Можно просмотреть текст, связанный с номером ошибки @@ERROR в sys.messages.

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

Для обработки ошибок используйте конструкцию TRY...CATCH. Конструкция TRY...CATCH также поддерживает дополнительные системные функции (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY и ERROR_STATE), возвращающие более подробные сведения, чем @@ERROR. Кроме того, TRY...CATCH поддерживает функцию ERROR_NUMBER, которая не ограничена тем, что возвращает номер ошибки немедленно после выполнения инструкции
26 июн 15, 11:37    [17819281]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
iap
Member

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

[VCODE] [int] NOT NULL

И как же туда запихнуть 'q' ???
Покажите, пожалуйста.
26 июн 15, 11:38    [17819294]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
вам вообщеб try -catch +transaction нужен....
вы пытаетесь решить проблему игры на скрипке при помощи ножовки вместо смычка
26 июн 15, 11:38    [17819295]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
iap
Member

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

[VCODE] [int] NOT NULL

И как же туда запихнуть 'q' ???
Покажите, пожалуйста.
Или Вы специально так написали?
Тогда я не понял вопроса
26 июн 15, 11:40    [17819316]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
rm2
Member

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

[VCODE] [int] NOT NULL

И как же туда запихнуть 'q' ???
Покажите, пожалуйста.
Или Вы специально так написали?
Тогда я не понял вопроса


Да я специально написал, пытался смоделировать ситуацию неправильного апдейта, когда например процедура пытается проапдейтить таблицу, а та (таблица) заблокирована, и апдейт не происходит, а скрипт идёт на выполнение дальше, и уже в другие таблице (к примеру) записываются неправильные данные, что плохо ((
26 июн 15, 11:56    [17819443]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
rm2
Member

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

[VCODE] [int] NOT NULL

И как же туда запихнуть 'q' ???
Покажите, пожалуйста.
Или Вы специально так написали?
Тогда я не понял вопроса


Ну и собственно говоря пытался разобраться как работает рол_бек_транзакшн, а он у меня в данном примере не заработал ))
26 июн 15, 11:57    [17819451]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
iap
Member

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

выполните SET XAC_ABORT ON перед началом транзакции.
Тогда после ошибки будет откат всей транзакции.
26 июн 15, 11:58    [17819456]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
iap
Member

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

выполните SET XAC_ABORT ON перед началом транзакции.
Тогда после ошибки будет откат всей транзакции.
И почитайте про XACT_ABORT
26 июн 15, 11:58    [17819461]     Ответить | Цитировать Сообщить модератору
 Re: Begin Transaction  [new]
rm2
Member

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

выполните SET XAC_ABORT ON перед началом транзакции.
Тогда после ошибки будет откат всей транзакции.
И почитайте про XACT_ABORT


Спасибо большое, понял ))))
26 июн 15, 12:00    [17819470]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить