2013-08-19 21 views
5

我創建一個存儲過程。其中首先我檢查一張表,如果表是在我的數據庫中,那麼我將它放下並創建新表,其次我在SP中創建一個存儲過程,在那裏我將值插入表中。我的問題是,當我在存儲過程中添加存儲過程部分時,我收到錯誤incorrect syntax near begin expecting 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

在'GO'或';'標記的批次結束之前,關鍵字'AS'出現兩次。

將SP的創建封裝爲字符串(動態SQL),然後使用EXEC(@SQL)調用該字符串的執行,如果要使用另一個SP創建SP。