2013-08-19 12 views
5

Tworzę procedurę składowania. W którym najpierw sprawdzam tabelę, jeśli tabela jest w moim DB, wtedy upuszczam ją i tworzę nową tabelę, Drugi tworzę tam procedurę sklepu w SP, gdzie wstawiam wartość do tabeli. Mój problem polega na tym, że kiedy dodaję część procedury sklepu do procedury sklepu, otrzymuję komunikat o błędzie incorrect syntax near begin expecting EXTERNAL. Poniżej znajduje się procedura mojego sklepu, czy możesz mi pomóc, gdzie robię źle.Niepoprawna składnia w pobliżu zaczyna się spodziewać ZEWNĘTRZNEJ

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 

Dzięki.

+0

Czy próbujesz utworzyć 'updateroute_sp' z * wewnątrz *' myProcedure'? Jeśli tak, będziesz musiał użyć dynamicznego SQL, ale nie jestem pewien, dlaczego próbujesz zamknąć jednorazowy proces (tworzenie tabeli i przechowywanego procesu) w samej procedurze. Jeśli możesz wyjaśnić, dlaczego to robisz, możemy zaoferować lepsze sugestie. –

+0

@Damien_The_Unbeliever Dzięki, rozumiem, że logiczne nie jest dobrze, aby utworzyć SP w SP, ale mój klient tego chce, ponieważ konwertuję ten kod z Sybase na SQL SERVER – Abhishek

Odpowiedz

2

Słowo kluczowe "AS" występuje dwa razy przed końcem partii oznaczonej "GO" lub ";".

Kapsuł tworzenie SP w ciągu znaków (dynamiczny SQL), a następnie wywołaj wykonywanie tego ciągu za pomocą EXEC (@SQL), jeśli chcesz utworzyć SP z innym SP.

Powiązane problemy