Не удалось зафиксировать ошибку в процедуре хранения в sql server

#sql-server #tsql

#sql-server #tsql

Вопрос:

тело моего SP выглядит следующим образом…когда я пытаюсь ее запустить, я получаю сообщение об ошибке. я просто не понимаю, почему выдана ошибка…где находится фактическая ошибка. пожалуйста, помогите мне.

 Create table #jobs (id int identity(1,1),Specialist varchar(50),JID int)  
insert into #jobs values('ANA', 1) 
insert into #jobs values('ANA', 5) 
insert into #jobs values('ANA', 9) 
insert into #jobs values('ANA', 7) 
insert into #jobs values('ANA', 6)   

insert into #jobs values('GEN', 2) 
insert into #jobs values('GEN', 3) 
insert into #jobs values('GEN', 11) 
insert into #jobs values('GEN', 13) 
insert into #jobs values('GEN', 45)  
insert into #jobs values('GEN', 23) 
insert into #jobs values('GEN', 28)    
insert into #jobs values('GEN', 41) 
insert into #jobs values('GEN', 49) 
insert into #jobs values('GEN', 52) 

insert into #jobs values('robin', 12) 
insert into #jobs values('robin', 15) 
insert into #jobs values('robin', 17) 

declare @i smallint, @j smallint = 0
; with cte as (select COUNT(*) cnt FROM #jobs group by Specialist) select @i=MAX(cnt) from cte

declare @sql nvarchar(max)
set @sql = N'
;with cte as (
        select distinct Specialist from #jobs
)
select
        Specialist '

while @i > @j
begin
        set @j = @j   1;
        set @sql = @sql   N'
        ,(
                select id from (
                        select 
                                rn = row_number() over (partition by Specialist order by id),
                                id
                        from #jobs
                        where Specialist = cte.Specialist
                ) t
                where rn = '   cast(@j as varchar(3))   '
        ) as id
        '
end

set @sql = @sql   N' from cte '
print @sql
exec sp_executesql @sql
  

Комментарии:

1. Какое сообщение об ошибке вы получаете?

2. У меня этот код отлично работает в SQL 2008 (хотя это странный способ выполнения операции pivot, учитывая, что в TSQL есть PIVOT оператор)

Ответ №1:

вы не можете присвоить значения по умолчанию локальным переменным… поэтому просто удалите «= 0» из этой строки :

 declare @i smallint, @j smallint = 0 ; with ct....
  

итак, он гласит…

 declare @i smallint, @j smallint; with ct....
  

HTH.
Дэйв

PS … не забудьте удалить свою временную таблицу, когда закончите с ней…

Комментарии:

1. Синтаксический ярлык, присваивающий значения при объявлении переменных, допустим для T-SQL в SQL 2008 и более поздних версиях

Ответ №2:

Изменить

 declare @i smallint, @j smallint = 0
  

Для

 DECLARE @i SMALLINT, @j SMALLINT
SET @j = 0