2013-08-19 12 views
5

Ich erstelle eine Speicherprozedur. In dem ersten prüfe ich eine Tabelle, wenn die Tabelle in meiner Datenbank ist, dann lasse ich sie fallen und erstelle eine neue Tabelle. Zweitens erstelle ich eine Speicherprozedur dort innerhalb des SP, wo ich einen Wert in die Tabelle einfüge. Mein Problem ist, dass ich Fehler incorrect syntax near begin expecting EXTERNAL bekomme, wenn ich Speicherprozedurteil in der Speicherprozedur hinzufüge. Unten ist meine Ladenprozedur können Sie mir bitte helfen, wo ich falsch mache.falsche Syntax in der Nähe von Anfang erwartet EXTERN

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 

Danke.

+0

Versuchen Sie, 'updateroute_sp' von * in *' myProcedure' zu ​​erstellen? Wenn dies der Fall ist, müssen Sie dynamisches SQL verwenden, aber ich bin nicht wirklich sicher, warum Sie versuchen, einen einmaligen Prozess (Erstellen einer Tabelle und eines gespeicherten Proc) in einer Prozedur selbst einzukapseln. Wenn Sie erklären könnten, warum Sie das tun, können wir Ihnen vielleicht bessere Vorschläge machen. –

+0

@Damien_The_Unbeliever Dank ich verstehe das ist logisch nicht gut, um SP unter SP zu erstellen, aber mein Client möchte dies, weil ich diesen Code von Sybase zu SQL Server konvertieren – Abhishek

Antwort

2

Das Schlüsselwort 'AS' ist zweimal vor dem Ende der durch 'GO' oder ';' gekennzeichneten Charge vorhanden.

Verkapseln Sie die Erstellung des SP in einer Zeichenfolge (dynamisches SQL), und rufen Sie dann die Ausführung dieser Zeichenfolge mit EXEC (@SQL) auf, wenn Sie ein SP mit einem anderen SP erstellen möchten.

Verwandte Themen