2013-08-19 11 views
5

ストアプロシージャを作成します。最初にテーブルが自分のDBにある場合はテーブルをチェックし、次にドロップして新しいテーブルを作成します。次に、テーブル内に値を挿入するSP内にストアプロシージャを作成します。私の問題は、ストアプロシージャの一部をストアプロシージャに追加すると、エラーincorrect syntax near begin expecting EXTERNALが発生しているということです。以下は私の店の手順ですが、私が間違っているところで私を助けてください。構文が間違っています。始める前にEXTERNAL

ALTER PROCEDURE myProcedure 
AS 
BEGIN 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ATSROUTES]') AND type in (N'U')) 
DROP TABLE [dbo].[ATSROUTES] 


    CREATE TABLE [ATSROUTES](
    [zip] [varchar](255) NULL, 
    [route] [varchar](255) NULL, 
    [drivernum] [varchar](255) NULL, 
    [altserviceid] [varchar](255) NULL, 
    [localorldrvnum] [varchar](255) NULL, 
    [pickupzone] [varchar](255) NULL, 
    [distcenter] [varchar](255) NULL, 
    [altdispid] [varchar](255) NULL, 
    [id] [int] NULL); 

    BULK INSERT ATSROUTES FROM 'C:\Routes\my1.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') 


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateroute_sp]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].updateroute_sp 

CREATE procedure updateroute_sp 
AS 
BEGIN 

    DECLARE @route varchar(255) 
    DECLARE @zip varchar(255) 
    DECLARE @routeid varchar(255) 
    DECLARE @distcenter varchar(255) 
    DECLARE @altdispid varchar(255) 



    DECLARE @ERR_NOTFOUND varchar(2000) 

    DECLARE db_Cursor CURSOR FOR SELECT zip, [route] from ATSROUTES 

OPEN db_Cursor 

    FETCH NEXT FROM db_Cursor INTO @zip,@route 
    WHILE @@FETCH_STATUS = 0 

    BEGIN 
     IF (@route is not null and @route <> '') 
     BEGIN 
     IF NOT EXISTS (SELECT * FROM routenames WHERE routename = @ROUTE) 
     BEGIN 
      EXEC GETNEWRECID2 'ROUTENAMES','ROUTEID','ROUTENAMES',@ROUTEID 
      insert into routenames (routeid,routename) values (@routeid,@ROUTE); 
     END 

    END 

FETCH NEXT FROM db_Cursor INTO @zip,@route 

    END 
     CLOSE db_Cursor 
     DEALLOCATE db_Cursor 
    END 


    EXEC updateroute_sp 

    DROP PROCEDURE updateroute_sp 

    UPDATE ATSROUTES set id = (select routeid from routenames where routename = [route]); 
    UPDATE ATSROUTES set drivernum =LTRIM(RTRIM(drivernum)); 

    END 

ありがとうございます。

+0

* myProcedure内の*からupdateroute_spを作成しようとしていますか?その場合は、動的SQLを使用する必要がありますが、プロシージャ内にプロセスをカプセル化(テーブルとストアドプロシージャの作成)しようとする理由がわかりません。なぜこれをやっているのか説明できれば、より良い提案をすることができます。 –

+0

@Damien_The_Unbelieverありがとう私はこれは論理的SPの下でSPを作成するには良いが、私のクライアントは、このコードをSybaseからSQL Server – Abhishek

答えて

2

キーワード 'AS'は、 'GO'または ';'でマークされたバッチの最後の2倍前に存在します。

SPの作成を文字列(動的SQL)でカプセル化し、別のSPでSPを作成する場合は、EXEC(@SQL)でその文字列の実行を呼び出します。

関連する問題