2013-08-19 12 views
5

Ho creato una procedura di archiviazione. In cui per prima cosa controllo una tabella se la tabella è nel mio DB allora la lascio cadere e creo una nuova tabella, in secondo luogo creo una procedura di memorizzazione lì all'interno della SP dove sto inserendo il valore nella tabella. Il mio problema è che quando aggiungo la parte relativa alla procedura di archiviazione nella procedura di memorizzazione, ricevo l'errore incorrect syntax near begin expecting EXTERNAL. Di seguito è riportata la procedura del mio negozio, per favore aiutami dove sto sbagliando.sintassi errata vicino in attesa 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 

Grazie.

+0

Stai cercando di creare 'updateroute_sp' da * in *' myProcedure'? In tal caso, sarà necessario utilizzare SQL dinamico, ma non sono proprio sicuro del motivo per cui si sta tentando di incapsulare un processo singolo (creando una tabella e un processo memorizzato) all'interno di una procedura stessa. Se potresti spiegare perché lo stai facendo, potremmo essere in grado di offrire alcuni suggerimenti migliori. –

+0

@Damien_The_Unbeliever Grazie capisco che questo non è logico per creare SP in SP, ma il mio client lo desidera perché sto convertendo questo codice da Sybase a SQL SERVER – Abhishek

risposta

2

La parola chiave "AS" è presente due volte prima della fine del batch contrassegnata da "GO" o ";".

Incapsulare la creazione dell'SP in una stringa (SQL dinamico), quindi richiamare l'esecuzione di tale stringa con EXEC (@SQL) se si desidera creare un SP con un altro SP.

Problemi correlati