Sql server 2008 为什么CREATE PROCEDURE语句在这里与IF语句一起使用时失败?

Sql server 2008 为什么CREATE PROCEDURE语句在这里与IF语句一起使用时失败?,sql-server-2008,tsql,batch-file,Sql Server 2008,Tsql,Batch File,我试图删除存储过程(如果存在),然后通过以下方式创建它: IF OBJECT_ID('[dbo].[myStoredProc]') IS not NULL DROP PROCEDURE dbo.myStoredProc CREATE PROCEDURE [dbo].[myStoredProc] ( @parameter1 BIT ) AS IF @parameter1 = 1 BEGIN .... 但它抱怨说: “CREATE PROCE

我试图删除存储过程(如果存在),然后通过以下方式创建它:

IF OBJECT_ID('[dbo].[myStoredProc]') IS not NULL
    DROP PROCEDURE dbo.myStoredProc


CREATE PROCEDURE [dbo].[myStoredProc]
(
    @parameter1 BIT
) AS

IF @parameter1 = 1
    BEGIN
             ....
但它抱怨说:

“CREATE PROCEDURE必须是批处理中的唯一语句”


问题:如何修复脚本以克服此问题?

您需要在第一个逻辑批处理的末尾放置一个
go

IF OBJECT_ID('[dbo].[myStoredProc]') IS not NULL
    DROP PROCEDURE dbo.myStoredProc
go -- you need to add the batch-terminator 'go'


CREATE PROCEDURE [dbo].[myStoredProc]
(
    @parameter1 BIT
) AS

IF @parameter1 = 1
    BEGIN
             ..
IF
语句之后添加表明这是第一批查询的结束

请在此处阅读更多信息:


这将防止您的错误发生。

成功!但为什么有必要终止?我指的是逻辑behind@pencilCake因为
CREATE PROCEDURE
语句必须是批处理中的第一个语句(并且是唯一的一个)。@pencilCake:我认为,为了避免可能出现的关于定义中应该包含哪些内容的混淆。假设它们允许您将过程创建与其他语句混合使用。然后,人们自然会希望不仅可以将语句放在过程定义之前,还可以放在过程定义之后,作为某些对象创建逻辑的一部分。但你怎么知道定义的终点呢?全局
开始。。。结束
关键字不是强制性的,任何数量的语句都可以作为跟随,因此,其中哪一个语句不再是过程的一部分,而是属于“外部”脚本?@pencilCake:另一件事:您可以在
创建/更改过程
之前添加注释和/或任何数量的空行,解析器将它们包含在定义中。但是,如果在
CREATE PROCEDURE
和前面的语句之间有一个注释段,解析器如何“知道”注释是属于前面的语句还是属于前面的过程?所以,最终,我猜,他们只是以上述限制结束:您只在单独的批处理中定义一个过程(以及一个函数、一个视图、一个触发器)。
IF OBJECT_ID('[dbo].[myStoredProc]') IS not NULL
    DROP PROCEDURE dbo.myStoredProc
GO