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

Откуда:
Сообщений: 8
Добрый день!

Есть процедура, в которой записан цикл while, который проходится по исходной таблице и делает несколько инсертов в разные таблицы.
Если запустить этот скрипт, на загоняя в процедуру, то он отлично выполняется и делает то, что от него требуется.
Однако если тот же самый скрипт записать в процедуру, то процедура не выполняется и выдает ошибки о том, что инсерты не удовлетворяют проверкам по ключам.

Кратко говоря, абсолютно рабочий скрипт при вызове его из процедуры не выполняется и завершается с ошибками.

Помогите, пожалуйста, разобраться, в чём дело.
29 май 17, 20:08    [20521268]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4364
EvgeniyR
Помогите, пожалуйста, разобраться, в чём дело.


А как вы предполагаете вам помогут, если вы не запостили сюда ваш скрипт?
29 май 17, 20:27    [20521295]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30698
EvgeniyR
Однако если тот же самый скрипт записать в процедуру, то процедура не выполняется и выдает ошибки о том, что инсерты не удовлетворяют проверкам по ключам.
Ну, очевидно, код в процедуре хоть чем то отличается.
29 май 17, 21:25    [20521426]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

Откуда:
Сообщений: 8
Скрипт:

+
USE [TestDB]
GO
/****** Object:  StoredProcedure [my].[CreatePR_GP_test]    Script Date: 29.05.2017 19:31:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc [my].[CreatePR_GP_test]

AS

SET NOCOUNT ON;

DECLARE @i as int = 1, @p2 int, @p3 int, @DocID int, @SpecID int;

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

WHILE @i<(select count(*) from my.RefGP)+1 Begin

	begin try
	--проверяем, есть ли контрагент в справочнике контрагентов:
	if not exists (select * from RefClient where INN in (select INN from my.RefGP where ID=@i) and KPP in (select KPP from my.RefGP where ID=@i))
		begin

			exec CFGetNextNumber @Code=N'RefClient',@Number=@p3 output

			insert into RefClient
			select '0'+cast(@p3 as varchar(35)) Code, Name, NULL, INN, KPP, 'RUS', NULL, NULL, NULL, NULL, NULL
			from my.RefGP where ID=@i;

			insert into REFClientBankAcc
			select (select idc from RefClientView where Code='0'+cast(@p3 as varchar(35))) as ItemID, 'BA', BIK, AccountCode, NULL, '', '', NULL, NULL, 'RUR', ''
			from my.RefGP where ID=@i;

			insert into RefClientKBK
			select '0'+cast(@p3 as varchar(35)) ClientCode, KBK, ''
			from my.RefGP where ID=@i;

			insert into RefAddress
			select (select idc from RefClientView where Code='0'+cast(@p3 as varchar(35))) as ItemID, 'JA', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL
			, NULL, NULL, NULL, OKTMO, '' 
			from my.RefGP where ID=@i;

		end;

		--проверяем, есть ли КБК у этого контрагента в справочнике КБК:
		if not exists (select * from RefClientKBK where 
					   Clientcode in (select max(code) from refclient where INN in (select INN from my.RefGP where ID=@i) 
									  and KPP in (select KPP from my.RefGP where ID=@i)) and Code=(select KBK from my.RefGP where ID=@i))
			begin

				insert into RefClientKBK 
				select (select max(code) from refclient where INN in (select INN from my.RefGP where ID=@i) and KPP in (select KPP from my.RefGP where ID=@i)),
				KBK, ''
				from my.RefGP where ID=@i

			end;
	
			exec CFGetNextNumber @Code=N'BDocument_PRWeb2017',@Number=@p2 output;

			insert into BDocument 
			(DocTypeCode,FormCode,Number,DocumentDate,ParentID,Autor,CurrencyCode,Summa,Rate,Name,
			IsClosed,IsPosted,PeriodType,DateFrom,DateTo) 
			values ('PR','PRR',@p2,CAST(current_timestamp as date),null,'11548','RUR',(select Summa from my.RefGP where ID=@i),1.0000,null,' ',' ',0,null,null);
			SELECT @DocID = cast(SCOPE_IDENTITY() as int);
			insert into BDocument_PR (IDC,ClientCode,PaymentDsc,VATSum,InvoiceNumber,Comment,PaymentCurrency,IsRollPay,BIsInBudget,
			BCheckComment,TIsAdvertise,TIsHR,TIsRepresentExp,TIsInsurance,TIsTravelExp,TIsFAExp,TIsIAExp,TIsCostIncr,TIsProfit,
			TIsCost,TNumber,TPeriodService,TComment,TDocState,TPeriod,TDocNumber,TDocDate,TPayType,TPayComment,CurrCheckLaw,
			CurrServiceKind,CurrPayDirection,CurrComment,TPSum,TPTaxKind,TPAccount,TPDsc,TPTaxRank,TPDocState,TPPeriod,TPDocNumber,
			TPDocDate,TPPayType,TPPayComment,BPaymentDate,BSum,BVATSum,BVATProc,BPaySumTaxOut,BPaySumTaxIn,BRank,BInfoExists,
			BExtinguishTerm,BSendDate,BReciveDate,BComment,PaymentRateType,CurrCountryCode,CurrOperCode,BDAccount,ClientAccRoleCode,
			TPClientCode,TPClientAccRoleCode,CurrDealPassport,IsPayOnContract,SrcNumber,PayerDepartment,ResponsUser,BPayORZP,
			SpecAccList,PaymentRateDsc,ClientLSAccRoleCode,BStateDuty,ClientKBK,ClientOKATO,TPClientKBK,TPClientOKATO,IsPayed,
			TPNDFLProcCode,TPNDFLSumma,IsERFormed,PostDetachedCode,RFBDPayType) 
				values (@DocID,(select max(code) from refclient where INN in (select INN from my.RefGP where ID=@i) and KPP in (select KPP from my.RefGP where ID=@i)),
				'Гос.пошлина за рассмотрение заявлений о взыскании задолженности в отношении клиента ' + (select FIO from my.RefGP where ID=@i) + ', № договора ' + (select ContractNumber from my.RefGP where ID=@i) + ', № клиента ' + (select IDClient from my.RefGP where ID=@i),
				0,'',null,'RUR',' ','*',null,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
				null,null,null,'01',0,null,null,null,null,' ',null,null,null,0.00,null,null,null,0,null,null,null,null,null,null,null,
				0.00,0.00,0.000,0.00,0.00,0,' ',0,null,null,null,'Курс_ЦБ',null,null,null,
				(select max(AccRoleCode) from REFClientBankAcc where ItemID in (select idc from RefClientView where code in ((select max(code) from refclient where INN in (select INN from my.RefGP where ID=@i) and KPP in (select KPP from my.RefGP where ID=@i)))) and AccRoleCode like 'BA%'),
				null,null,null,' ',
				(case when (select SegmentCode from my.RefGP where ID=@i) in ('000','6','15') then '#' else '&' end),
				null,'admin',' ', null,null,null,0,(select KBK from my.RefGP where ID=@i),(select OKTMO from my.RefGP where ID=@i),null,null,' ',null,0.00,' ',null, 1)

			exec BDocAnalytSetObj @AnalytTypeCode=N'OrgStuf',@Code='11203',@DocID=@DocID,@ReferID=186,@TreeKindCode=NULL
			exec BDocAnalytSetObj @AnalytTypeCode=N'SrcDepAn',@Code='3218',@DocID=@DocID,@ReferID=186,@TreeKindCode=NULL

			insert into BDocSpec (DocID,PosNumb,DocSpecTypeCode,OperationCode,AccountCode,Summa) 
			values (@DocID,1,'PR',null,'2601',(select Summa from my.RefGP where ID=@i));
			SELECT @SpecID = cast(SCOPE_IDENTITY() as int);
			insert into BDocSpec_PR (DocID,IDC,Comment,SummAcc,EstDepCode,Amount,RecivDepCode,SegmentCode,ProductCode,
			UseDateFrom,UseDateTo,DepartmentCode,OverEstimate,ReservSummAcc,SrcDocID,SrcSpecID,BTaskCode,PayDateFrom,PayDateTo) values
			(@DocID,@SpecID,
			'Гос.пошлина за рассмотрение заявлений о взыскании задолженности в отношении клиента ' + (select FIO from my.RefGP where ID=@i) + ', № договора ' + (select ContractNumber from my.RefGP where ID=@i) + ', № клиента ' + (select IDClient from my.RefGP where ID=@i),
			(select Summa from my.RefGP where ID=@i),'3218',0.000,'3218',
			'000','0000',null,null,'11203','',0.00,null,null,'000.009.766',null,null)
			
			exec SetSpecAccList @DocID

			insert into wfdocstatelog (DocID, WFTypeCode, PosNumb, Code, Autor, OperDateTime, IsStateCleare, Comment)
			values (@DocID, 'PR', 110, 'S', '11548', getdate(), '', '');

			insert into wfdocstate (DocID, WFTypeCode, PosNumb, Code, Autor)
			values (@DocID, 'PR', 110, 'S', '11548');

end try
begin catch
declare @err as varchar(255)
select @err = error_message()
raiserror (@err,14,15)
end catch


Create table #DLTemp

(
    DocID int primary key
)

insert #DLTemp 

select distinct doc.IDC
            from dbo.BDocument doc
                  inner join dbo.BDocument_PRView adoc on adoc.idc = doc.idc
                  left  join dbo.WFDocRunState ws on ws.WFTypeCode = 'PR' and ws.docID = doc.IDC 
            where doc.DocTypeCode = 'PR' 
        and number in (cast(@p2 as varchar)) --‘номер распоряжения’
Exec WFDListRunStateSet 'PR', 'PR'
drop table #DLTemp

SET @i=@i+1;

END;

truncate table my.RefGP;


Если выделить и запустить скрипт с объявления переменных (DECLARE), то выполняется.

Сообщение было отредактировано: 30 май 17, 12:59
30 май 17, 08:46    [20521860]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
EvgeniyR,

полностью ошибку
30 май 17, 08:51    [20521867]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

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

Скрин ошибки

К сообщению приложен файл. Размер - 114Kb
30 май 17, 08:58    [20521880]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

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

Исходная таблица my.RefGP

К сообщению приложен файл. Размер - 71Kb
30 май 17, 08:59    [20521886]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
EvgeniyR,

на вскидку ANSI_WARNING OFF стоит в SSMS
30 май 17, 09:10    [20521915]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

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

В начале процедуры прописал:

SET ANSI_WARNINGS ON;

Всё равно ошибка та же. Не помогло (
30 май 17, 09:53    [20522074]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
EvgeniyR
TaPaK,

В начале процедуры прописал:

SET ANSI_WARNINGS ON;

Всё равно ошибка та же. Не помогло (

ошибка и должна быть, просто должна быть в обоих местах
30 май 17, 09:59    [20522112]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Попытаться выяснять, почему у вас происходит нарушение констрейнта вы не в силах.
Сразу решили обратиться к форумным старожилам - они-то в силу своего опыта сразу скажут, в чем проблема, и тут же выдадут нагора валидный код, решающий эту и еще с десяток проблем...

Изолируйте этот участок и проведите всестороннее PRINT-исследование
exec CFGetNextNumber @Code=N'RefClient',@Number=@p3 output
insert into RefClient
select '0'+cast(@p3 as varchar(35)) Code, Name, NULL, INN, KPP, 'RUS', NULL, NULL, NULL, NULL, NULL
from my.RefGP where ID=@i;
30 май 17, 10:00    [20522122]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
aleks2
Guest
EvgeniyR
TaPaK,

В начале процедуры прописал:

SET ANSI_WARNINGS ON;

Всё равно ошибка та же. Не помогло (


Да, мы все умрем!!!

Что за беспомощный идиотизм?

1. Модифицируем процедуру

ALTER proc [my].[CreatePR_GP_test]

AS

SET NOCOUNT ON;

DECLARE @i as int = 1, @p2 int, @p3 int, @DocID int, @SpecID int;

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

WHILE @i<(select count(*) from my.RefGP)+1 Begin

	begin try
--проверяем, есть ли контрагент в справочнике контрагентов:
if not exists (select * from RefClient where INN in (select INN from my.RefGP where ID=@i) and KPP in (select KPP from my.RefGP where ID=@i))
	begin

	exec CFGetNextNumber @Code=N'RefClient',@Number=@p3 output


	insert into RefClient
	select '0'+cast(@p3 as varchar(35)) Code, Name, NULL, INN, KPP, 'RUS', NULL, NULL, NULL, NULL, NULL
	from my.RefGP where ID=@i;

       if @@errror <> 0 begin
       -- вывод вставляемых значений
	select [@id]= @i, '0'+cast(@p3 as varchar(35)) Code, Name, NULL, INN, KPP, 'RUS', NULL, NULL, NULL, NULL, NULL
	from my.RefGP where ID=@i;
       end;


2. Отгребаем ошибочную вставку.

3. Медитируем...
30 май 17, 10:04    [20522156]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleks2,
Руслан Дамирович

а почему эти парни решили, что проблема во вставке RefClient, когда ругается на референс....
30 май 17, 10:10    [20522203]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

Откуда:
Сообщений: 8
Руслан Дамирович, aleks2,

очень прошу Вас прежде, чем давать комментарии, читать текст описываемой проблемы внимательнее (или вообще читать).
Чтобы Вас лишний раз не тревожить, постараюсь написать ещё раз и попроще:

Скрипт ВНЕ процедуры отрабатывает без нарушения констрейнта. Этот же скрипт В процедуре отрабатывает с нарушением констрейнта.

Изолируя проблемные участки и вставляя какие-то значения в явном виде, процедура отрабатывает. Но никаких выводов из этого сделать не представляется возможным, т.к. это не решение и не путь к пониманию.

Модифицировали процедуру - и что нам это дало? Ничего. Просто какое-то действие ради действия?

Опытные форумчане, будьте внимательнее и не делитесь своим опытом, если это неуместно.
30 май 17, 10:48    [20522400]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
EvgeniyR,

бараны не читают, повторяю медленно: ошибка у вас и там и там, в студии вам ошибку тушит.
30 май 17, 10:53    [20522419]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
David_Brazil
Member

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

Заинтересовала тема.
Внимательно прочитал ваши ответы. Поясните и там и там - это и в процедуре и в скрипте???


И что значит студия тушит ошибку? Почему не тушит в процедуре?
30 май 17, 11:51    [20522706]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
David_Brazil,

у него либо разные user options, либо он на разных базах выполняет или он выполняет разные скрипты. Я больше склонен к последнему
30 май 17, 12:35    [20522902]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
aleks2
Guest
EvgeniyR
Руслан Дамирович, aleks2,

очень прошу Вас прежде, чем давать комментарии, читать текст описываемой проблемы внимательнее (или вообще читать).
Чтобы Вас лишний раз не тревожить, постараюсь написать ещё раз и попроще:

Скрипт ВНЕ процедуры отрабатывает без нарушения констрейнта. Этот же скрипт В процедуре отрабатывает с нарушением констрейнта.

Изолируя проблемные участки и вставляя какие-то значения в явном виде, процедура отрабатывает. Но никаких выводов из этого сделать не представляется возможным, т.к. это не решение и не путь к пониманию.

Модифицировали процедуру - и что нам это дало? Ничего. Просто какое-то действие ради действия?

Опытные форумчане, будьте внимательнее и не делитесь своим опытом, если это неуместно.


Такой умный и так облажался?
30 май 17, 12:37    [20522910]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
invm
Member

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

Чудес не бывает. Для начала можете сравнить что возвращает exec CFGetNextNumber @Code=N'RefClient',@Number=@p3 output в обоих случаях для проблемных значений @i.
Почти это вам и советовал aleks2.
30 май 17, 12:58    [20523060]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

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

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

Ладно, спасибо за то, что хотя бы попытались помочь.
Дальше буду разбираться самостоятельно.
30 май 17, 14:21    [20523529]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30698
EvgeniyR
ну совсем за дурака меня держать не надо. База, конечно, одна и та же. Скрипт я выделяю и запускаю прямо в тексте процедуры.
Поэтому в этом смысле не придраться.
А таблица та же?
А то в процедуре обращение происходит к dbo.RefClient, а вот в скрипте это не очевидно.

Ну и, как уже говорили, CFGetNextNumber тоже может отработать по разному - очевидно, если таблица RefClient одна и та же, то причина может быть только в CFGetNextNumber, остальной код можно не смотреть.
30 май 17, 14:41    [20523611]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30698
alexeyvg
EvgeniyR
ну совсем за дурака меня держать не надо. База, конечно, одна и та же. Скрипт я выделяю и запускаю прямо в тексте процедуры.
Поэтому в этом смысле не придраться.
А таблица та же?
А то в процедуре обращение происходит к dbo.RefClient, а вот в скрипте это не очевидно.
То есть в процедуре обращение к my.RefClient, а в скрипте наверняка к dbo.RefClient, потому что любой девелопер обязательно сисадмин :-)

Но неважно, идею же вы поняли?

PS Недавно кто то доказывал, что писать схему у объекта не нужно, т.к. это очень тяжело и совершенно бесполезно.
30 май 17, 14:47    [20523666]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
alexeyvg,


автор
PS Недавно кто то доказывал, что писать схему у объекта не нужно, т.к. это очень тяжело и совершенно бесполезно.

поддержу идею со схемой. посмотрите скриптом
SELECT * FROM sys.objects WHERE object_Id = object_Id('RefClient')
30 май 17, 14:56    [20523746]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30698
TaPaK
поддержу идею со схемой. посмотрите скриптом
SELECT * FROM sys.objects WHERE object_Id = object_Id('RefClient')
Лучше так:
SELECT * FROM sys.objects WHERE name = 'RefClient'
30 май 17, 15:05    [20523813]     Ответить | Цитировать Сообщить модератору
 Re: Процедура выполняется с ошибкой, хотя скрипт ВНЕ процедуры работает  [new]
EvgeniyR
Member

Откуда:
Сообщений: 8
alexeyvg, TaPaK

Огромное спасибо за помощь!
Вы оказались правы. Оказывается в моей базе на схеме my была одноимённая таблица refclient. Именно к ней обращалась процедура при инсертах.
Как показали дальнейшие эксперименты, по умолчанию процедура берет таблицу на своей схеме (в моём случае - это схема my).

Решение - просто в тексте процедуры в явном виде указывать схему dbo.
30 май 17, 15:36    [20524003]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить