2013-08-19 39 views
5

Tôi tạo một quy trình lưu trữ. Trong đó đầu tiên tôi kiểm tra một bảng nếu bảng là trong DB của tôi sau đó tôi thả nó và tạo ra bảng mới, thứ hai tôi tạo ra một thủ tục lưu trữ có trong SP nơi tôi đang chèn giá trị trong bảng. Vấn đề của tôi là khi tôi thêm một phần thủ tục lưu trữ trong thủ tục lưu trữ, tôi nhận được lỗi incorrect syntax near begin expecting EXTERNAL. Dưới đây là thủ tục cửa hàng của tôi, bạn có thể vui lòng giúp tôi nơi tôi đang làm sai.cú pháp không chính xác gần bắt đầu mong đợi 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 

Cảm ơn.

+0

Bạn đang cố gắng tạo 'updateroute_sp' từ * trong *' myProcedure'? Nếu vậy, bạn sẽ phải sử dụng SQL động, nhưng tôi không thực sự chắc chắn lý do tại sao bạn đang cố gắng để đóng gói một quá trình off (tạo ra một bảng và proc lưu trữ) trong một thủ tục chính nó. Nếu bạn có thể giải thích tại sao bạn làm điều này, chúng tôi có thể đưa ra một số gợi ý tốt hơn. –

+0

@Damien_The_Unbeliever Cảm ơn tôi hiểu điều này là hợp lý không tốt để tạo SP theo SP nhưng khách hàng của tôi muốn điều này bởi vì tôi đang chuyển đổi mã này từ Sybase sang SQL SERVER – Abhishek

Trả lời

2

Từ khóa 'AS' hiện diện hai lần trước khi kết thúc lô được đánh dấu bằng 'GO' hoặc ';'.

Đóng gói việc tạo SP trong chuỗi (SQL động), sau đó gọi thực hiện chuỗi đó bằng EXEC (@SQL) nếu bạn muốn tạo SP với SP khác.

Các vấn đề liên quan