2010-07-01 8 views
0

Вопрос: Если я добавлю, что IF не существует для процедуры create в качестве внешнего оператора имени, я получаю синтаксическую ошибку ... почему? Оба заявления работают нормально, если я запускать их отдельно ...Ошибка синтаксиса 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 должно быть первым заявлением в партии.

либо уронить процедурный первый или использовать динамический 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 и в одной и той же партии.