2012-04-27 3 views
0

Мне нужно создать хранимую процедуру с использованием решения Dynamic SQL, потому что мне нужно включить несколько условий вложенности. При запуске кода в Query Analyzeer появляется следующая ошибка.Что не так с моей хранимой процедурой

Msg 156, Level 15, State 1, Line 13 
Incorrect syntax near the keyword 'Procedure'. 

Процедура, которую я пытаюсь создать следующим образом:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[sp_Payments]') 
AND type in (N'P', N'PC')) 
Drop procedure sp_Payments 
BEGIN 
DECLARE @SQL varchar(max), 
    @categoryID smallint, 
    @startDate datetime, 
    @stopDate datetime, 
    @debtCode tinyint, 
    @izEscrow tinyint 


Create Procedure sp_Payments 
    (@categoryID smallint, 
    @startDate datetime, 
    @stopDate datetime, 
    @debtCode tinyint, 
    @izEscrow tinyint 
    ) 
AS 
BEGIN 
Declare @Payments table( 
     paydate datetime, 
     principaldue float, 
     interestdue float, 
     debtid int, 
     debtname varchar(50), 
     debtnumber varchar(10), 
     fsrc varchar(40), 
     category varchar(40), 
     PayMonth tinyint, 
     PayYear int 
) 
SET @SQL = ' 
insert into @Payments 
     select dtl.paydate, 
      dtl.principaldue, 
      dtl.interestdue, 
      dtl.debtid, 
      dmf.debtname, 
      dmf.debtnumber, 
      fsrc.fsrc, 
      app.category, 
      month(dtl.paydate) as PayMonth, 
      case 
       when month(PayDate) <= 6 then year(PayDate) 
       else year(PayDate)+1 
      end "PayYear" 
      from debtdetail dtl 
      inner join masterfile dmf 
      on dtl.debtid = dmf.debtid 
      inner join categories app 
      on dmf.categoryid = app.categoryid 
      left outer join fsrc 
      on dmf.fsrcid = fsrc.fsrcid 
      left outer join debtissues di 
      on dmf.issueid = di.issueid 
       where dtl.debtid in 
      (select debtid from masterfile 
       where categoryid = @categoryID ' 

     IF @debtCode > 0  
      SET @SQL = @SQL + ' 
       AND codeid = @debtCode 
       ' 
      SET @SQL = @SQL + ' 
       ) 
       AND di.iscontingent = 0 
       ' 
      IF @stopDate = '' 
       SET @SQL = @SQL + ' 
        and dtl.paydate >= @startDate 
       ' 
      ELSE 
       SET @SQL = @SQL + ' 
        and dtl.paydate between 
        @startDate AND @stopDate 
       ' 
      IF @izEscrow = 0 
       SET @SQL = @SQL + ' 
        and dtl.isescrow = 0 
       ' 
      SET @SQL = @SQL + ' 
      and (principaldue + interestdue) > 0 and dtl.active = 1 
        order by dtl.Paydate, dmf.DebtNumber ' 
EXEC @SQL 
END 

    SELECT * from @Payments 

RETURN 




END 

Любая помощь будет оценена. Заранее спасибо

+2

Вам нужно 'GO's между вашими партиями здесь. – JNK

+0

Есть и другие проблемы. Это довольно обратная конструкция. Почему вы объявляете все свои переменные, а затем создаете параметры с одинаковыми именами? – JNK

+1

Query Analyzer? Вы имели в виду Management Studio? Если вы используете этот код для SQL Server 2000, есть много вещей, которые помешают ему работать. Укажите версию SQL Server, которую вы используете. [tag: sql-server] недостаточно специфичен. –

ответ

-2

Избавиться от этого динамического SQL, и сделать что-то вроде:

AND (@debtCode = 0 OR codeId = @debtCode) 
... and so on 
+3

Вероятно, не подходящий язык для сайта для профессиональных разработчиков. – JNK