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

Откуда:
Сообщений: 154
Уважаемые форумчане - специалисты!

Подскажите, пожалуйста, по такому вопросу.

Может ли MS SQL 2008 R2 сбиваться и не до конца выполнять хранимую процедуру? В чем причины такого поведения?

Допустим что ошибок в коде ХП нет. База данных находится в публичном сервере, т.е. там кроме этой базы много других баз и запросы выполняются в порядке очереди.

Более подробнее ситуации такова:
Есть программа которая отправляет запрос в БД к хранимой процедуре о проведенной продаже. В параметре ХП таблица. Хранимая процедура должна на основе этой таблицы сначала сделать списания указанных товаров с остатков на складах, а потом вызвать другую ХП для увеличения остатка кассы. Заметил что бывает не увеличивает кассу, например. Может проблема в том что бд в общем сервере?
13 июн 13, 13:54    [14428140]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
_djХомяГ
Guest
Профайлером промониторте
13 июн 13, 13:56    [14428163]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilshatkin
Может ли MS SQL 2008 R2 сбиваться и не до конца выполнять хранимую процедуру? В чем причины такого поведения?

Без генерации ошибки ??? Не может.

ilshatkin
Может проблема в том что бд в общем сервере?

Проблема в вашем коде. А не в доступности сервера.
13 июн 13, 13:56    [14428165]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Спасибо за оперативный ответ. Понял. Буду копать
13 июн 13, 13:59    [14428189]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ilshatkin
Хранимая процедура должна на основе этой таблицы сначала сделать списания указанных товаров с остатков на складах, а потом вызвать другую ХП для увеличения остатка кассы. Заметил что бывает не увеличивает кассу, например.

Наивный вопрос -- списание товаров и увеличение остатка кассы происходят в одной транзакции?
13 июн 13, 14:47    [14428656]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Гость333
Наивный вопрос -- списание товаров и увеличение остатка кассы происходят в одной транзакции?


сильно подозреваю, что нет
13 июн 13, 14:48    [14428672]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Гость333
ilshatkin
Хранимая процедура должна на основе этой таблицы сначала сделать списания указанных товаров с остатков на складах, а потом вызвать другую ХП для увеличения остатка кассы. Заметил что бывает не увеличивает кассу, например.

Наивный вопрос -- списание товаров и увеличение остатка кассы происходят в одной транзакции?


Да, то есть делается запрос к ХП, условно назовем Продать_товары(таблицаТоваров), внутри этой ХП есть запрос к другой ХП Изменить_сальдо(счет, сумма) . Клиент тонкий, поэтому предпочел такую модель.

Что то не так? Почему вопрос наивный?

Был недавно зафиксирован случай когда касса не увеличилась, т.е как будто ХП Изменить_сальдо в ХП Продать_товары не сработало. До этого и после все работает нормально. Таких запросов в день генерятся где то 100 шт. система работает около года, поэтому был обескуражен произошедшим.
13 июн 13, 21:05    [14430680]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilshatkin
Да, то есть делается запрос к ХП, условно назовем Продать_товары(таблицаТоваров), внутри этой ХП есть запрос к другой ХП Изменить_сальдо(счет, сумма) . Клиент тонкий, поэтому предпочел такую модель.

Что то не так? Почему вопрос наивный?

Команды BEGIN/COMMIT/ROLLBACK TRANSACTION в вашем коде есть ?
14 июн 13, 10:51    [14432428]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

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


USE [xxxxxx]
GO
/****** Object:  StoredProcedure [dbo].[saleTovarTbl]    Script Date: 06/14/2013 21:55:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		<Ilshat>
-- Create date: <05072012>
-- Description:	<sale>
-- =============================================
ALTER PROCEDURE [dbo].[saleTovarTbl]
	@tovarViborka tovarViborka1 READONLY,
	@nomDoc int OUTPUT,
	@deystvie int 
	
AS
BEGIN

--@deystvie=0 - оплата отгрузка
--@deystvie=1 - отгрузка
--@deystvie=2 - оплата 


	
	SET NOCOUNT ON;
	
	DECLARE 
	    
		@sebestoim money,		
		@kolvoOstatok int,
		@userID int,
		@tovar int, 
		@sklad int, 
		@urlico int, 
		@kolich int, 
		@summa money, 
		@kontr int, 
		@shema int, 
		@mestoDS int, 
		@komment nvarchar(max),
		@tip int, 
		@data datetime,
		@obSumma money,		
		@kolvoNach int,
		@summaNach money,
		@operNach int,
		@nomDocNach int 
								
	SET @obSumma = 0;
	
	-- получаем номер документа продажи
	
	if @nomDoc=0
	BEGIN	
		EXEC	[dbo].[izmNomDoc]
		 1,
		 @nomer = @nomDoc OUTPUT	 
	END 
	 	 					
	DECLARE cursorVib CURSOR FOR
	
	SELECT userID, tovar, sklad, urlico, kolich, summa, 
		 kontr, shema, mestoDS, komment, tip, data FROM @tovarViborka
	
	OPEN cursorVib
	
	FETCH NEXT FROM cursorVib INTO  @userID, @tovar, @sklad, @urlico, @kolich, @summa, 
		 @kontr, @shema, @mestoDS, @komment, @tip, @data
		 	
	WHILE @@FETCH_STATUS = 0
		
	BEGIN
		
		--изменяем наличие 
		-- оплата отгрузка
		
		if  @deystvie<2  
		BEGIN		
			SET @sebestoim=0
				
			UPDATE [dbo].[nali4ie]
			SET 
		      
			    @operNach =[operation],
		        @nomDocNach =[nomDoc],		
	       		@summaNach =[summa],
				@sebestoim = [summa] / [kolvo] * @kolich,
				@kolvoOstatok = [kolvo]- @kolich,     
				[kolvo] =[kolvo] - @kolich,		
				[summa] = [summa]-@sebestoim,	
				[nomDoc]=@nomDoc,
				[operation]=1
	         
			WHERE [sklad] =@sklad  and [tovar] = @tovar and [urlico] = @urlico
				    
			-- удаляем строку, если не осталось в наличии
		    
			IF @kolvoOstatok = 0
			BEGIN
				DELETE FROM [dbo].[nali4ie]
				WHERE [sklad] =@sklad and [tovar] = @tovar and [urlico] = @urlico
			END		
		    
				   
			INSERT INTO [dbo].[historyBook]
				   ([idUser],[tovar],[sklad],[idKontr1],[kolvo],[summa],[idKontr2]
				   ,[shema],[mestoDS],[komment],[tip],[data]           
				   ,[dataServer],[operation],[nomDoc]
				   ,[sebestoim],[nomDocNach],[operNach],[kolvoNach],[summaNach],[kolvoPosle],[summaPosle])           
			VALUES(@userID, @tovar, @sklad, @urlico, @kolich, @summa, 
				 @kontr, @shema, @mestoDS, 
				 @komment, @tip, @data, GETDATE(), 1, @nomDoc,@sebestoim,
				 @nomDocNach,@operNach,
				 @kolvoOstatok+@kolich,@summaNach,@kolvoOstatok,@summaNach-@sebestoim)
	    
	    END
	         	
	    SET @obSumma=@obSumma+ @summa  	
	         	
	  
		FETCH NEXT FROM cursorVib INTO  @userID, @tovar, @sklad, @urlico, @kolich, @summa, 
		 @kontr, @shema, @mestoDS, @komment, @tip, @data
		 
	END	
	
	CLOSE cursorVib;
    DEALLOCATE cursorVib;
    
    
    -- не отгрузка
    
    if  @deystvie<>1     
    BEGIN  
    
		SET @komment = 'Пополнение денег вследствии продажи №' + CAST (@nomDoc AS nvarchar)	
		    
		-- изменяем сальдо на кассе или счете		
		EXEC	[dbo].[izmSaldoDS]
		 @userID,
		 @urlico,
		 @obSumma,	
		 @mestoDS,	
		 @data,
		 @kontr,
		 @shema,
		 @komment,
		 @tip,
		 6,
		 0
	END	
	
   
END


Вот такой код.
Буду признателен за подсказки)
14 июн 13, 22:00    [14435696]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
ilshatkin,
Я так понял, что отгрузка - когда @deystvie = 1.
Получается, что при отгрузке касса не должна пополняться , потому что
if @deystvie<>1


всю отгрузку надо обернуть в транзакцию. И - в зависимости от верности моего предположения - пополнение кассы тоже(иначе зачем считать @obSumma).
Может быть, еще и получение номера - это от логики зависит.

UPDATE [dbo].[nali4ie]
			SET 
		      
			    @operNach =[operation],
		        @nomDocNach =[nomDoc],		
	       		@summaNach =[summa],
				@sebestoim = [summa] / [kolvo] * @kolich,
				@kolvoOstatok = [kolvo]- @kolich,     
				[kolvo] =[kolvo] - @kolich,		
				[summa] = [summa]-@sebestoim, -- тут значение переменной не с предыдущего шага возьмется?	
				[nomDoc]=@nomDoc, -- получается, что отгрузка позиции происходит одним документом или запоминается только последний, это так?
				[operation]=1


P.S. Есть мнение, что можно без курсора обойтись.
14 июн 13, 22:35    [14435760]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
hoha_ftf
ilshatkin,
Я так понял, что отгрузка - когда @deystvie = 1.
Получается, что при отгрузке касса не должна пополняться , потому что
if @deystvie<>1


всю отгрузку надо обернуть в транзакцию. И - в зависимости от верности моего предположения - пополнение кассы тоже(иначе зачем считать @obSumma).
Может быть, еще и получение номера - это от логики зависит.


только отгрузка или оплата происходят очень редко, обычно всегда продажа (отгрузка и оплата) поэтому не стал выделять ее (@obSumma будет редко считаться в холостую)


hoha_ftf

				@sebestoim = [summa] / [kolvo] * @kolich,			
				[summa] = [summa]-@sebestoim, -- тут значение переменной не с предыдущего шага возьмется?	
				[nomDoc]=@nomDoc, -- получается, что отгрузка позиции происходит одним документом или запоминается только последний, это так?				




да, можно обойтись без @sebestoim

отгрузка, а если точнее назвать операция "списание товара" происходит под одним номером документа на перечень товара

hoha_ftf

P.S. Есть мнение, что можно без курсора обойтись.


был бы признателен совету как это сделать
14 июн 13, 23:27    [14435881]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
Гость333
Member

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

В вашей процедуре нет открытия/закрытия транзакции. Может быть, транзакция открывается снаружи, при вызове ХП?

Вообще в SQL Server атомарное действие (т.е. такое, которое либо фиксируется полностью, либо не фиксируется совсем) -- это именно транзакция, а не хранимая процедура. При вызове вашей процедуры без транзакции -- и касса может не увеличиться, и товары могут списаться не полностью, а лишь частично.

ilshatkin
			UPDATE [dbo].[nali4ie]
			SET 
			...
  				[kolvo] =[kolvo] - @kolich,		
			...
			WHERE [sklad] =@sklad  and [tovar] = @tovar and [urlico] = @urlico

Скажите, а от возможных отрицательных остатков вы как защищаетесь? Т.е. когда на вход процедуры приходит @kolich, больший, чем [kolvo]?
15 июн 13, 06:10    [14436486]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Гость333,

Такое впечатление, что из наличия строка списывается целиком
ilshatkin
отгрузка, а если точнее назвать операция "списание товара" происходит под одним номером документа на перечень товара


Или у ТС серьезный пробел в процедуре: напрмер, зачем тогда вообще высчитывать остаток(?)
15 июн 13, 13:15    [14436756]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Гость333
ilshatkin,

В вашей процедуре нет открытия/закрытия транзакции. Может быть, транзакция открывается снаружи, при вызове ХП?

Вообще в SQL Server атомарное действие (т.е. такое, которое либо фиксируется полностью, либо не фиксируется совсем) -- это именно транзакция, а не хранимая процедура. При вызове вашей процедуры без транзакции -- и касса может не увеличиться, и товары могут списаться не полностью, а лишь частично.



вот видимо в этом и есть пробел, что нет открытия/закрытия транзакции. Подскажите, пожалуйста как это сделать или где почерпнуть информацию. Спасибо

Гость333

ilshatkin
			UPDATE [dbo].[nali4ie]
			SET 
			...
  				[kolvo] =[kolvo] - @kolich,		
			...
			WHERE [sklad] =@sklad  and [tovar] = @tovar and [urlico] = @urlico

Скажите, а от возможных отрицательных остатков вы как защищаетесь? Т.е. когда на вход процедуры приходит @kolich, больший, чем [kolvo]?


Прежде чем запустить эту ХП программа проверяет наличие требуемых остатков, потом если @kolich, больший, чем [kolvo] то предлагается вначале оприходовать необходимое количество, выписывается документ оприходования и после этого уже запускается эта ХП. Поэтому в процедуре @kolich, не может быть больший, чем [kolvo] впринцыпе
15 июн 13, 13:51    [14436802]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
hoha_ftf
Гость333,

Такое впечатление, что из наличия строка списывается целиком
ilshatkin
отгрузка, а если точнее назвать операция "списание товара" происходит под одним номером документа на перечень товара


Или у ТС серьезный пробел в процедуре: напрмер, зачем тогда вообще высчитывать остаток(?)


Из наличия сейчас списывается все правильно.


@sebestoim money,
@kolvoOstatok int,

Рассчитываются для того чтобы впоследствии записать информацию в журнал событий. Это информация нужна потом для аналитических целей

INSERT INTO [dbo].[historyBook]
([idUser],[tovar],[sklad],[idKontr1],[kolvo],[summa],[idKontr2]
,[shema],[mestoDS],[komment],[tip],[data]
,[dataServer],[operation],[nomDoc]
,[sebestoim],[nomDocNach],[operNach],[kolvoNach],[summaNach],[kolvoPosle],[summaPosle])
VALUES(@userID, @tovar, @sklad, @urlico, @kolich, @summa,
@kontr, @shema, @mestoDS,
@komment, @tip, @data, GETDATE(), 1, @nomDoc,@sebestoim,
@nomDocNach,@operNach,
@kolvoOstatok+@kolich,@summaNach,@kolvoOstatok,@summaNach-@sebestoim)
15 июн 13, 13:56    [14436805]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
babaEGA
Member

Откуда: Москва
Сообщений: 289
Очень упрощенно :
BEGIN TRY
BEGIN TRAN
     загрузка
     отгрузка
     остатки
     касса и прочие ваши действия
COMMIT  -- все ок. Фиксируем транзакцию.
Print 'Процедура выполнена успешно.'
END TRY

BEGIN CATCH -- Сюда попадаем, если произошла ошибка.
print 'Произошла ошибка. Отменяем все действия'
IF @@TRANCOUNT>0 ROLLBACK
END CATCH
15 июн 13, 17:54    [14437070]     Ответить | Цитировать Сообщить модератору
 Re: сбой при выполнении хранимой процедуры  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
babaEGA
Очень упрощенно :
BEGIN TRY
BEGIN TRAN
     загрузка
     отгрузка
     остатки
     касса и прочие ваши действия
COMMIT  -- все ок. Фиксируем транзакцию.
Print 'Процедура выполнена успешно.'
END TRY

BEGIN CATCH -- Сюда попадаем, если произошла ошибка.
print 'Произошла ошибка. Отменяем все действия'
IF @@TRANCOUNT>0 ROLLBACK
END CATCH


Спасибо! это то за чем я обратился на форум
18 июн 13, 16:22    [14449048]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить