Ошибка выполнения SP - PullRequest
0 голосов
/ 16 мая 2011

Я пишу ниже SP. Но когда я пытаюсь выполнить этот запрос, я получаю эту ошибку:

В базе данных уже есть объект с именем '# myCourses1'.

Итак, это попадание в две другие петли.также

create proc [dbo].[GetOrdersByUserIDwithSubscription]     
(    
    @UserID int    
)    
as    
begin    

    declare @status varchar(500)

    declare @substatus char(2)

    select @substatus=Subscribe_status from tbl_user where userid=@userid

    print @substatus

    if  @substatus='N'

    BEGIN    
        select a.*, b.CategoryText, Cast('' as Varchar(10)) as SectionsViewed, PurchasedDate as dateadded into #myCourses1 from dbo.Tbl_CourseInformations  a JOIN Tbl_Categories b ON a.AssignCategory = b.CategoryID    
        Join Tbl_Orders c ON c.UserID = @UserID and c.CourseID = a.CourseID  and c.courseprice<>'subscriber'  
        Order By CategoryText, CourseTitle         
    END  

    else if @substatus=''

    BEGIN    
        select a.*, b.CategoryText, Cast('' as Varchar(10)) as SectionsViewed, PurchasedDate as dateadded into #myCourses1 from dbo.Tbl_CourseInformations  a JOIN Tbl_Categories b ON a.AssignCategory = b.CategoryID    
        Join Tbl_Orders c ON c.UserID = @UserID and c.CourseID = a.CourseID and c.courseprice<>'subscriber'   
        Order By CategoryText, CourseTitle       
    END  

    else if @substatus='Y'    
    BEGIN    
        select a.*, b.CategoryText, Cast('' as Varchar(10)) as SectionsViewed, PurchasedDate as dateadded into #myCourses1 from dbo.Tbl_CourseInformations  a JOIN Tbl_Categories b ON a.AssignCategory = b.CategoryID    
        Join Tbl_Orders c ON c.UserID = @UserID and c.CourseID = a.CourseID    
        Order By CategoryText, CourseTitle 
    END 

Ответы [ 4 ]

1 голос
/ 16 мая 2011

SQL Parser задыхается, потому что вы использовали одно и то же имя временной таблицы в разных частях оператора IF. IF не имеет области видимости, как другие языки программирования.

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

Посмотрите на мой ответ на аналогичный вопрос .

1 голос
/ 16 мая 2011

Кроме того, чудовищность вашего запроса может быть уменьшена до:

create proc [dbo].[GetOrdersByUserIDwithSubscription](    
    @UserID int    
)    
as    
begin
    declare @substatus char(2)

    select @substatus = Subscribe_status 
    from tbl_user 
    where userid = @userid

    select a.*, b.CategoryText, 
        Cast("" as Varchar(10)) as SectionsViewed, 
        PurchasedDate as dateadded 
    from dbo.Tbl_CourseInformations a 
        join Tbl_Categories b ON a.AssignCategory = b.CategoryID
        join Tbl_Orders c ON c.UserID = @UserID 
            and c.CourseID = a.CourseID 
            and (@substatus = 'N' or c.courseprice <> 'subscriber')
    order by CategoryText, CourseTitle         

END
0 голосов
/ 16 мая 2011

Явно создайте временную таблицу в начале процедуры.

CREATE TABLE #myCourses1 (
    ...
)

Затем напишите свои SELECT заявления как:

INSERT INTO #myCourses1
    select a.*, b.CategoryText, Cast('' as Varchar(10)) as SectionsViewed, PurchasedDate as dateadded 
        from dbo.Tbl_CourseInformations
        ...
0 голосов
/ 16 мая 2011

Ваш синтаксис

SELECT [Column-List] INTO #TempTable FROM [Rest-of-Query]

При использовании этого синтаксиса Sql Server пытается создать #TempTable на лету на основе списка столбцов ( source ).

Чтобы обойти это, либо Drop #TempTable в начале хранимой процедуры (если вам не нужны ее данные за пределами SP), либо сделайте ее постоянной таблицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...