【问题标题】:Incorrect syntax near the keyword 'PROCEDURE' [closed]关键字“PROCEDURE”附近的语法不正确[关闭]
【发布时间】:2013-05-24 07:13:24
【问题描述】:

在 SQL Server 中执行以下语句

IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_CandidateRegistration]') AND type in (N'P', N'PC'))
BEGIN
CREATE PROCEDURE [dbo].[SP_CandidateRegistration]
    (
            @UserName VARCHAR(50),      
            @Password VARCHAR(50),
            @EmailID VARCHAR(50),
            @TestId int,
            @IsActiveUser INTEGER,      
            @USER_ID INTEGER OUTPUT
    )
    AS
    DECLARE @UserName VARCHAR(50)
    DECLARE @Password VARCHAR(50)
    DECLARE @EmailID VARCHAR(50)
    DECLARE @TestId int
    DECLARE @IsActiveUser INTEGER       
    DECLARE @USER_ID INTEGER 

    INSERT INTO [dbo].[IER_CandidateRegistration](User_Name, Password, EmailId, Test_Id, is_active )
    VALUES (@UserName, @Password, @EmailID,@TestId, @IsActiveUser) 
    select @USER_ID=@@identity
    RETURN
END
GO

在 SQL Server 2008 中执行后出错

消息 156,第 15 级,状态 1,第 3 行
关键字“PROCEDURE”附近的语法不正确。

【问题讨论】:

标签: sql sql-server-2008 stored-procedures


【解决方案1】:

CREATE PROCEDURE 语句不能与单个批处理中的其他 Transact-SQL 语句组合。 所以,你必须这样做:-

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_CandidateRegistration]') AND type in (N'P', N'PC'))
DROP PROCEDURE [SP_CandidateRegistration]
GO

CREATE PROCEDURE [dbo].[SP_CandidateRegistration]
    (
            @UserName VARCHAR(50),      
            @Password VARCHAR(50),
            @EmailID VARCHAR(50),
            @TestId int,
            @IsActiveUser INTEGER,      
            @USER_ID INTEGER OUTPUT
    )
    AS

    INSERT INTO [dbo].[IER_CandidateRegistration](User_Name, Password, EmailId, Test_Id, is_active )
    VALUES (@UserName, @Password, @EmailID,@TestId, @IsActiveUser) 
    select @USER_ID=@@identity
    RETURN

GO

另外,你又要声明变量了。

【讨论】:

  • 这还将删除有关程序的任何元数据,例如 DMV 中的权限、执行计划、历史使用统计信息
【解决方案2】:

您可以在仅编译和执行IF NOT EXISTS 的子批处理中运行CREATE

您需要先修复过程中的错误(为什么要声明与参数同名的变量也使用SCOPE_IDENTITY() 而不是@@IDENTITY)但类似

IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_CandidateRegistration]') AND type in (N'P', N'PC'))
BEGIN
EXEC('
     CREATE PROCEDURE [dbo].[SP_CandidateRegistration] (@UserName     VARCHAR(50),
                                                       @Password     VARCHAR(50),
                                                       @EmailID      VARCHAR(50),
                                                       @TestId       INT,
                                                       @IsActiveUser INTEGER,
                                                       @USER_ID      INTEGER OUTPUT)
    AS
        INSERT INTO [dbo].[IER_CandidateRegistration]
                    (User_Name,
                     Password,
                     EmailId,
                     Test_Id,
                     is_active)
        VALUES      (@UserName,
                     @Password,
                     @EmailID,
                     @TestId,
                     @IsActiveUser)

        SELECT @USER_ID = SCOPE_IDENTITY()

RETURN 
    ')
END

【讨论】:

  • 如果有单引号,需要转义。
【解决方案3】:

试试这个:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_CandidateRegistration]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[SP_CandidateRegistration]
GO
CREATE PROCEDURE [dbo].[SP_CandidateRegistration]
    (
            @UserName VARCHAR(50),      
            @Password VARCHAR(50),
            @EmailID VARCHAR(50),
            @TestId int,
            @IsActiveUser INTEGER,      
            @USER_ID INTEGER OUTPUT
    )
    AS
    BEGIN
    DECLARE @UserName1 VARCHAR(50)
    DECLARE @Password1 VARCHAR(50)
    DECLARE @EmailID1 VARCHAR(50)
    DECLARE @TestId1 int
    DECLARE @IsActiveUser1 INTEGER       
    DECLARE @USER_ID1 INTEGER 

    INSERT INTO [dbo].[IER_CandidateRegistration](User_Name, Password, EmailId, Test_Id, is_active )
    VALUES (@UserName, @Password, @EmailID,@TestId, @IsActiveUser) 
    select @USER_ID=@@identity
    RETURN
END
GO

【讨论】:

  • 好像和Pranav的建议一样?
  • 是的,我在发布答案后看到了他的解决方案
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2016-01-16
  • 2013-12-16
  • 2017-11-22
相关资源
最近更新 更多