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

Откуда:
Сообщений: 299
вот моя процедура, догадываюсь что столь обьемный кусок кода помещать в текс не очень правильно, но он всеравно почему то неработает. подскажите в чем дело.
+
ALTER PROCEDURE [dbo].[addParam]
@NameLabel nvarchar(256),
@id_1C nvarchar(512),
@parentName nvarchar(512),
@used_table nvarchar(512)
AS
declare
@st nvarchar(1024),
@signature nvarchar(64)=N'Уровень'
begin
set @st='
declare
@NameLabel nvarchar(256)='''+@NameLabel+''',
@id_1C nvarchar(512)='''+@id_1C+''',
@parentName nvarchar(512)='''+@parentName+''',
@used_table nvarchar(512)='''+@used_table+''',
@value bigint=2,
/*table D_*/
@MemberID bigint,
@Description nvarchar(512) = null,
@SequenceNumber bigint=null,
@SourceMemberID bigint =null,
@OwnerID bigint=0,
@CreateChangeDatetime datetime=GETDATE(),
@LoadingControlId bigint=1000,
@lvlPosition bigint,
@Формат	nvarchar(512),
/* table H_*/
@RowID bigint,
@ParentMemberId bigint=1,
/*table NS_*/
@rgtPoint bigint,
@lft bigint,
@modelsiteID bigint=0,
@depth bigint=0,
@parentDepth bigint,
@lvl bigint
select @NameLabel
/*check unique name*/
if  not exists (select * from [Asteros_App].[dbo].[D_ЦФО] where label=@NameLabel )
begin

/*inser table D_*/

	select @MemberID=MAX(memberID)+1 from [Asteros_App].[dbo].[D_ЦФО]
	select @lvlPosition=MAX(lvlPosition)+1 from [Asteros_App].[dbo].[D_ЦФО]
	select @SequenceNumber=SequenceNumber+1024 from [Asteros_App].[dbo].[D_ЦФО] where lvlPosition=@lvlPosition-1
	
	select @ParentMemberId=MemberId from [Asteros_App].[dbo].[D_ЦФО] where Name=@parentName
	
	select @lvl=lvl+1 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
  where [MemberId]=@ParentMemberId
  
  set @Формат= CONVERT(nvarchar(512),@lvl) 
	
	insert into [Asteros_App].[dbo].[D_ЦФО](
	  [MemberId]
      ,[Label]
      ,[Description]
      ,[Name]
      ,[SequenceNumber]
      ,[SourceMemberID]
      ,[OwnerID]
      ,[CreateDatetime]
      ,[ChangeDatetime]
      ,[LoadingControlId]
      ,[lvlPosition]
      ,[id_1C]
      ,[Формат]
	)
	values(
	@MemberID,
	@NameLabel,
	@Description,
	@NameLabel,
	@SequenceNumber,
	@SourceMemberID,
	@OwnerID,
	@CreateChangeDatetime,
	@CreateChangeDatetime,
	@LoadingControlId,
	@lvlPosition,
	@id_1C,
	@Формат
	)
	
/*end table D_*/

/*insert table H_*/
select @RowID=MAX(rowId)+1 from [Asteros_App].[dbo].[H_ЦФО_ЦФО]

select @SequenceNumber=MAX(SequenceNumber)+1024 
	from [Asteros_App].[dbo].[H_ЦФО_ЦФО] 
	where ParentMemberId=@ParentMemberId
	
if  not exists (select SequenceNumber
	from [Asteros_App].[dbo].[H_ЦФО_ЦФО] 
	where ParentMemberId=@ParentMemberId)
	begin
 set @SequenceNumber=1024
	end
	
insert into [Asteros_App].[dbo].[H_ЦФО_ЦФО](
		[RowId]
      ,[MemberId]
      ,[ParentMemberId]
      ,[OwnerID]
      ,[SequenceNumber]
      ,[CreateDatetime]
      ,[ChangeDatetime]
      ,[LoadingControlId]
)
values(
	@RowID,
	@MemberID,
	@ParentMemberId,
	@OwnerID,
	@SequenceNumber,
	@CreateChangeDatetime,
	@CreateChangeDatetime,
	@LoadingControlId
)
/*end table H_*/

/*inset table NS_*/
select @rgtPoint=rgt,@lvl=lvl+1,@lft=lft
 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
  where [MemberId]=@ParentMemberId
  
select @lvlPosition=MAX(lvlPosition)+1 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
where lft>=@lft and rgt <= @rgtPoint

if  not exists (select lvlPosition from [Asteros_App].[dbo].[NS_ЦФО_ЦФО] where lft>=@lft and rgt < =@rgtPoint)
 begin
 set @lvlPosition=1
 end
	
/*if parent is simple element, that update depth*/
	if(select depth from [Asteros_App].[dbo].[NS_ЦФО_ЦФО] where MemberId=@ParentMemberId)=0
		begin
			update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
			set depth=1
			where MemberId=@ParentMemberId
		end

update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
set lft=lft+@value,rgt=rgt+@value
 where lft>=@rgtPoint
 
 update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
 set rgt=rgt+@value
 where lft< @rgtPoint and rgt >= @rgtPoint
 
insert into [Asteros_App].[dbo].[NS_ЦФО_ЦФО](
[MemberId]
      ,[lft]
      ,[rgt]
      ,[modelsiteID]
      ,[depth]
      ,[lvl]
      ,[lvlPosition]
)
values(
	@MemberID,
	@rgtPoint,
	@rgtPoint+@value-1,
	0,
	@depth,
	@lvl,
	@lvlPosition
)
/*end table NS_*/

end'
exec(@st)
end


ошибки
Msg 102, Level 15, State 1, Line 16
Incorrect syntax near '?'.
Msg 137, Level 15, State 2, Line 27
Must declare the scalar variable "@NameLabel".
Msg 137, Level 15, State 2, Line 29
Must declare the scalar variable "@NameLabel".
Msg 137, Level 15, State 1, Line 34
Must declare the scalar variable "@MemberID".
Msg 137, Level 15, State 1, Line 35
Must declare the scalar variable "@lvlPosition".
Msg 137, Level 15, State 1, Line 36
Must declare the scalar variable "@SequenceNumber".

в таком виде все работает
+

ALTER PROCEDURE [dbo].[addParam]
@NameLabel nvarchar(256),
@id_1C nvarchar(512),
@parentName nvarchar(512),
@used_table nvarchar(512)
AS
declare
@st nvarchar(1024),
@signature nvarchar(64)=N'Уровень',
/*
set @st='
declare
@NameLabel nvarchar(256)='''+@NameLabel+''',
@id_1C nvarchar(512)='''+@id_1C+''',
@parentName nvarchar(512)='''+@parentName+''',
@used_table nvarchar(512)='''+@used_table+''',*/
@value bigint=2,
/*table D_*/
@MemberID bigint,
@Description nvarchar(512) = null,
@SequenceNumber bigint=null,
@SourceMemberID bigint =null,
@OwnerID bigint=0,
@CreateChangeDatetime datetime=GETDATE(),
@LoadingControlId bigint=1000,
@lvlPosition bigint,
@Формат	nvarchar(512),
/* table H_*/
@RowID bigint,
@ParentMemberId bigint=1,
/*table NS_*/
@rgtPoint bigint,
@lft bigint,
@modelsiteID bigint=0,
@depth bigint=0,
@parentDepth bigint,
@lvl bigint
begin
/*check unique name*/
if  not exists (select * from [Asteros_App].[dbo].[D_ЦФО] where label=@NameLabel )
begin

/*inser table D_*/

	select @MemberID=MAX(memberID)+1 from [Asteros_App].[dbo].[D_ЦФО]
	select @lvlPosition=MAX(lvlPosition)+1 from [Asteros_App].[dbo].[D_ЦФО]
	select @SequenceNumber=SequenceNumber+1024 from [Asteros_App].[dbo].[D_ЦФО] where lvlPosition=@lvlPosition-1
	
	select @ParentMemberId=MemberId from [Asteros_App].[dbo].[D_ЦФО] where Name=@parentName
	
	select @lvl=lvl+1 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
  where [MemberId]=@ParentMemberId
  
  set @Формат= CONVERT(nvarchar(512),@lvl) 
	
	insert into [Asteros_App].[dbo].[D_ЦФО](
	  [MemberId]
      ,[Label]
      ,[Description]
      ,[Name]
      ,[SequenceNumber]
      ,[SourceMemberID]
      ,[OwnerID]
      ,[CreateDatetime]
      ,[ChangeDatetime]
      ,[LoadingControlId]
      ,[lvlPosition]
      ,[id_1C]
      ,[Формат]
	)
	values(
	@MemberID,
	@NameLabel,
	@Description,
	@NameLabel,
	@SequenceNumber,
	@SourceMemberID,
	@OwnerID,
	@CreateChangeDatetime,
	@CreateChangeDatetime,
	@LoadingControlId,
	@lvlPosition,
	@id_1C,
	@Формат
	)
	
/*end table D_*/

/*insert table H_*/
select @RowID=MAX(rowId)+1 from [Asteros_App].[dbo].[H_ЦФО_ЦФО]

select @SequenceNumber=MAX(SequenceNumber)+1024 
	from [Asteros_App].[dbo].[H_ЦФО_ЦФО] 
	where ParentMemberId=@ParentMemberId
	
if  not exists (select SequenceNumber
	from [Asteros_App].[dbo].[H_ЦФО_ЦФО] 
	where ParentMemberId=@ParentMemberId)
	begin
 set @SequenceNumber=1024
	end
	
insert into [Asteros_App].[dbo].[H_ЦФО_ЦФО](
		[RowId]
      ,[MemberId]
      ,[ParentMemberId]
      ,[OwnerID]
      ,[SequenceNumber]
      ,[CreateDatetime]
      ,[ChangeDatetime]
      ,[LoadingControlId]
)
values(
	@RowID,
	@MemberID,
	@ParentMemberId,
	@OwnerID,
	@SequenceNumber,
	@CreateChangeDatetime,
	@CreateChangeDatetime,
	@LoadingControlId
)
/*end table H_*/

/*inset table NS_*/
select @rgtPoint=rgt,@lvl=lvl+1,@lft=lft
 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
  where [MemberId]=@ParentMemberId
  
select @lvlPosition=MAX(lvlPosition)+1 from [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
where lft>=@lft and rgt <= @rgtPoint

if  not exists (select lvlPosition from [Asteros_App].[dbo].[NS_ЦФО_ЦФО] where lft>=@lft and rgt < =@rgtPoint)
 begin
 set @lvlPosition=1
 end
	
/*if parent is simple element, that update depth*/
	if(select depth from [Asteros_App].[dbo].[NS_ЦФО_ЦФО] where MemberId=@ParentMemberId)=0
		begin
			update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
			set depth=1
			where MemberId=@ParentMemberId
		end

update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
set lft=lft+@value,rgt=rgt+@value
 where lft>=@rgtPoint
 
 update [Asteros_App].[dbo].[NS_ЦФО_ЦФО]
 set rgt=rgt+@value
 where lft< @rgtPoint and rgt >= @rgtPoint
 
insert into [Asteros_App].[dbo].[NS_ЦФО_ЦФО](
[MemberId]
      ,[lft]
      ,[rgt]
      ,[modelsiteID]
      ,[depth]
      ,[lvl]
      ,[lvlPosition]
)
values(
	@MemberID,
	@rgtPoint,
	@rgtPoint+@value-1,
	0,
	@depth,
	@lvl,
	@lvlPosition
)
/*end table NS_*/

end
end
2 сен 11, 09:32    [11216181]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Che0,

print(@st)
и поглядите, что сформировано.
2 сен 11, 09:40    [11216214]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
iap
Member

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

у Вас все строки юникодные. Поэтому добавьте к литеральным строкам букву N. Например:
set @st='
declare
@NameLabel nvarchar(256)=N'''+@NameLabel+''',
2 сен 11, 10:01    [11216355]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Che0
вот моя процедура, догадываюсь что столь обьемный кусок кода помещать в текс не очень правильно, но он всеравно почему то неработает. подскажите в чем дело.
Очевидно, текст запроса не помещается в 1024 символа.
2 сен 11, 10:05    [11216400]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
Che0
Member

Откуда:
Сообщений: 299
kDnZP, Огромное спасибо. у меня нехватало длинны @st и русские буквы отображались вопросами.
2 сен 11, 10:07    [11216415]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
должно хватать
Guest
Che0,

грустно когда не хватает длины...
2 сен 11, 12:38    [11217416]     Ответить | Цитировать Сообщить модератору
 Re: Динамическая процедура  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
Вот интересно, а зачем имена таблиц и полей делать в кирилице? Не лень раскладку переключать?
2 сен 11, 17:35    [11220247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить