如何在存储过程中使用 DECLARE

Posted

技术标签:

【中文标题】如何在存储过程中使用 DECLARE【英文标题】:How to use DECLARE in a stored procedure 【发布时间】:2021-09-27 04:24:30 【问题描述】:

我正在创建一个存储过程,一旦记录是新的,它将在表中创建一个新行,如果记录存在于表中,则更新现有记录。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [procedurename]
    (@UserName [varchar](50),
     @UserEmail [varchar](50),
     @Role [varchar](30),
     @Status [varchar](30),
     @CreationDate [Date])
AS
    DECLARE @countRec INT

    SELECT @countRec = COUNT(*) 
    FROM [Synapse].[tablename] 
    WHERE [UserName] = @Username

BEGIN
    IF (@countRec = 0)
    BEGIN
        INSERT INTO [Synapse].[tablename] ([UserName], [UserEmail], [Role], [Status], [CreationDate])
        VALUES (@Username, @UserEmail, @Role, @Status, @CreationDate)
    END
    ELSE (@countRec > 0)
    BEGIN
        UPDATE [Synapse].[tablename]
        SET [Role] = @Role, 
            [Status] = @Status, 
            [CreationDate] = @CreationDate 
        WHERE [UserName] = @Username

        INSERT INTO [Synapse].[tablename]
    END

我收到以下错误:

消息 103010,第 16 层,状态 1,第 8 行 在第 39 行解析错误,第 7 列:'@countRec' 附近的语法不正确。

我不确定它为什么指向 countRec 变量。我能够使用类似的设置而没有任何问题。有谁知道我在这里做错了什么?

亲切的问候,

罗格

【问题讨论】:

用简单的 ELSE 替换 ELSE (@countRec>0) 我得到的第一个错误不在第 8 行,而是在第 35 行:ELSE (@countRec>0)。如果您想为您的ELSE 使用布尔表达式,它需要是ELSE IF 而不仅仅是ELSE 如果我使用 ELSE,我会得到以下信息(消息 103010,级别 16,状态 1,第 8 行解析错误,第 46 行,第 1 列:'END' 附近的语法不正确。) 如果我使用 ELSE IF (@countRec>0) 我收到以下错误:Msg 103010, Level 16, State 1, Line 8 Parse error at line: 46, column: 1: Incorrect syntax near '结束'。 好吧,算上你的 BEGINENDs - 它们应该是相等的。您的IF 上方似乎有一个奖金。 【参考方案1】:

您有许多语法错误 - 主要是:在进行任何声明或选择之前,您需要以 BEGIN 开始您的程序 - 最后您缺少一个 END

试试这个:

CREATE PROCEDURE [procedurename]
    (@UserName [varchar](50),
     @UserEmail [varchar](50),
     @Role [varchar](30),
     @Status [varchar](30),
     @CreationDate [Date])
AS
BEGIN    -- put the "BEGIN" before you start declaring and selecting stuff
    DECLARE @countRec INT

    SELECT @countRec = COUNT(*) 
    FROM [Synapse].[tablename] 
    WHERE [UserName] = @Username

    IF (@countRec = 0)
    BEGIN
        INSERT INTO [Synapse].[tablename] ([UserName], [UserEmail], [Role], [Status], [CreationDate])
        VALUES (@Username, @UserEmail, @Role, @Status, @CreationDate)
    END
    -- either you have just an "ELSE" here - or if you want to 
    -- check another conditions, you need to use "ELSE IF ....."
    ELSE IF (@countRec > 0)
    BEGIN
        UPDATE [Synapse].[tablename]
        SET [Role] = @Role, 
            [Status] = @Status, 
            [CreationDate] = @CreationDate 
        WHERE [UserName] = @Username
    END
END   -- this was missing

【讨论】:

BEGIN/END 整个过程体周围是optional in T-SQL。在这种情况下,程序的结束由批处理的结束分隔。 @Damien_The_Unbeliever: 好的 - 但 OP 在初始声明和选择后有一个 BEGIN - 但不是 END BEGIN ... @marc_s 谢谢!有效。迷失在所有的开始和结束中......

以上是关于如何在存储过程中使用 DECLARE的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlserver存储过程中输出参数,语句是啥,我不用输出参数,我只是在体内输出语句,请问是啥??

如何在存储过程中删除一张表,表名是作为参数传入的

SQL Server2008 存储过程传入表名称和列名称,如何在语句中使用表明引用列名?

sql 存储过程中何时使用declare声明变量

如何在sql server中检查所有存储过程是否正常?

存储过程中'@'和'DECLARE'有什么区别?