如何在存储过程中使用 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 '结束'。
好吧,算上你的 BEGIN
和 END
s - 它们应该是相等的。您的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存储过程中输出参数,语句是啥,我不用输出参数,我只是在体内输出语句,请问是啥??