Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите разобраться с написанием ХП  [new]
dron123
Guest
научите правильно писать хп на insert\update\del данных, как бы мои работают, но я понимаю что они плохонькие, объясните плз что у меня не так в общем и :
2 Как и где пользоваться @@trancount?
3 Как делать проверки на нефиксируемые транзакции?
4 Как делать проверки выполнения ХП в контексте транзакции?
+

create proc [buh_cma].[doc_basis_ins]
	@id_eco_type				smallint,
	@id_doc_type				tinyint,
	@doc_data					date,
	@doc_number					varchar(50),
	@id_conterpart_customers	int,
	@id_conterpart_arrival		int,
	@id_conterpart_expense		int,
	@id_account					int,
	@id_contract				int,
	@id_oper_type				tinyint,
	@summa						decimal(8,2),
	@prim						varchar(500),
	@id_condition				tinyint,
	@is_buh_move				bit,
	@kod_fil					tinyint,
	@upd_user					smallint
as
begin
set nocount on
set xact_abort on
--
declare
@error_msg		nvarchar(1000),
@id_doc_basis	int
--
begin try
	begin transaction
	-- doc_basis
	insert into buh_cma.doc_basis
	(id_eco_type, id_doc_type, doc_data, doc_number, id_conterpart_customers, id_conterpart_arrival, id_conterpart_expense,
	id_account, id_contract, id_oper_type, summa, prim, id_condition, is_buh_move, kod_fil, upd_user)
	values(@id_eco_type, @id_doc_type, @doc_data, @doc_number, @id_conterpart_customers, @id_conterpart_arrival, @id_conterpart_expense,
	@id_account, @id_contract, @id_oper_type, @summa, @prim, @id_condition, @is_buh_move, @kod_fil, @upd_user)
	--
	set @id_doc_basis = CAST(SCOPE_IDENTITY() as int)
	-- cma_move
	if @id_condition = 2 -- 1 черновик, 2 проведён
	begin
		insert into buh_cma.cma_move(id_doc_basis, data, id_eco_type, id_conterpart_customers, id_conterpart_arrival, id_conterpart_expense, id_contract, kod_fil)
		values(@id_doc_basis, @doc_data, @id_eco_type, @id_conterpart_customers, @id_conterpart_arrival, @id_conterpart_expense, @id_contract, @kod_fil)
	end
	--
	select @id_doc_basis
	--
	commit transaction
	--
end try
begin catch
	set @error_msg = ERROR_MESSAGE()
	rollback transaction
	raiserror(@error_msg, 16, 1)
end catch
end;



delete
+

create proc [buh_cma].[doc_basis_del]
	@id_doc_basis	int,
	@row_version	rowversion
as
begin
set nocount on
set xact_abort on
--
declare
@error_msg	nvarchar(1000),
@rv_cur		rowversion
--
begin try
	begin transaction
	--
	set @rv_cur = (select rv from buh_cma.doc_basis where id = @id_doc_basis)
	--
	if @rv_cur = @row_version
	begin
		-- doc_item_arrival
		delete buh_cma.doc_item_arrival
		where id_doc_basis = @id_doc_basis
		-- cma_move_item_arrival
		delete buh_cma.cma_move_item_arrival
		where id_cma_move = @id_doc_basis
		-- cma_move
		delete buh_cma.cma_move
		where id_doc_basis = @id_doc_basis		
		-- doc_basis
		delete buh_cma.doc_basis
		where id = @id_doc_basis
		--
		commit transaction
		--
	end
	else
	begin
		set @error_msg = 'Операция не выполнена, т.к. данные были изменены другим пользователем.'
		raiserror(@error_msg, 16, 1)
	end
end try
begin catch
	set @error_msg = ERROR_MESSAGE()
	rollback transaction
	raiserror(@error_msg, 16, 1)
end catch
--
end;

23 янв 12, 16:33    [11953847]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с написанием ХП  [new]
aleks2
Guest
0. Нафега вам ЭТО?

2. @@trancount=количество(begin transaction)-количество(commit) предшествующих точке обращения к @@trancount.
3. Нафега вам это?
4. @@trancount>0 = в транзакции
23 янв 12, 16:44    [11953960]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с написанием ХП  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Так в хелпе все есть:
Просвещайтесь на здоровье.
http://msdn.microsoft.com/ru-ru/library/ms188378.aspx
http://msdn.microsoft.com/ru-ru/library/ms189797.aspx
http://msdn.microsoft.com/ru-ru/library/ms179296.aspx
23 янв 12, 16:46    [11953980]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить