【问题标题】:SQL Syntax error CREATE PROCEDURE AS EXTERNALSQL 语法错误 CREATE PROCEDURE AS EXTERNAL
【发布时间】:2010-07-01 11:42:55
【问题描述】:

问题:如果我将 IF not exists 添加到创建过程作为外部名称语句,我会收到语法错误...为什么? 如果我分别运行它们,这两个语句都可以正常工作...

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

【问题讨论】:

    标签: sql syntax syntax-error sqlclr clrstoredprocedure


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      试试

      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 之前和同一批次的东西。

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 2020-02-08
        • 1970-01-01
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        • 2022-01-07
        • 2017-10-13
        • 1970-01-01
        相关资源
        最近更新 更多