2010-07-01 81 views
0

問題:如果我添加IF不存在作爲外部名稱語句的創建過程,我得到一個語法錯誤...爲什麼? 兩個語句正常工作,如果我分開運行...SQL語法錯誤CREATE PROCEDURE AS EXTERNAL

IF NOT EXISTS 
(
    SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'PriceSum') 
    AND type in (N'P', N'PC') 
) 
CREATE PROCEDURE PriceSum(@sum int OUTPUT) 
    AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].PriceSum 

回答

1

因爲CREATE PROCEDURE必須是批處理中的第一條語句。

要麼首先刪除PROC或使用動態SQL

IF NOT EXISTS 
(
    SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'PriceSum') 
    AND type in (N'P', N'PC') 
) 
exec('CREATE PROCEDURE PriceSum(@sum int OUTPUT) 
    AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].PriceSum') 

也可以反轉邏輯

IF EXISTS 
    (
     SELECT * FROM sys.objects 
     WHERE object_id = OBJECT_ID(N'PriceSum') 
     AND type in (N'P', N'PC') 
    ) 

    DROP PROCEDURE PriceSum 
    GO --this ends the batch, so the create statement below is fine 

    CREATE PROCEDURE PriceSum(@sum int OUTPUT) 
AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].PriceSum 
    GO 
0

嘗試

IF NOT EXISTS 
(
    SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'PriceSum') 
    AND type in (N'P', N'PC') 
) 

EXEC ('CREATE PROCEDURE PriceSum(@sum int OUTPUT) 
    AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].PriceSum') 

我不認爲這CREATE PROCEDURE前,在同一批次喜歡的東西。