2012-04-27 15 views
0

動的SQLソリューションを使用してストアドプロシージャを作成する必要があるのは、複数の入れ子を条件に含める必要があるためです。クエリアナライザでコードを実行すると、次のエラーが表示されます。私のストアドプロシージャで何が問題になっています

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

他にも問題があります。これはかなり後ろ向きのデザインです。なぜすべての変数を宣言してから、同じ名前のparamsを作成するのですか? – JNK

+1

クエリアナライザ? Management Studioを意味しましたか? SQL Server 2000に対してこのコードを実行している場合、動作しないようにする多くのことがあります。使用しているSQL Serverのバージョンを指定してください。 [tag:sql-server]は具体的ではありません。 –

答えて

-2

は、動的SQLを取り除く、およびような何か:

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

おそらくプロの開発者向けのサイトには適切な言語ではありません。 – JNK

関連する問題