【问题标题】:Return value in SQL Server stored procedureSQL Server 存储过程中的返回值
【发布时间】:2012-03-23 10:19:38
【问题描述】:

我有一个包含 if 语句的存储过程。如果计数的行数大于0,那么它应该将唯一的输出参数@UserId设置为0

但是它只在查询的第二部分返回一个值。

@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0
    BEGIN
        SET @UserId = 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END

【问题讨论】:

  • “在查询的第二部分返回一个值”是什么意思?输出参数不会作为记录集返回

标签: sql sql-server stored-procedures


【解决方案1】:

您可以执行以下任一操作:

变化:

SET @UserId = 0 到 SELECT @UserId

这将以与 IF 语句的第二部分相同的方式返回值。


或者,将@UserId 设置为输出,更改:

SELECT SCOPE_IDENTITY()SET @UserId = SCOPE_IDENTITY()


这取决于您以后要如何访问数据。如果您希望该值出现在您的结果集中,请使用SELECT。如果以后要访问@UserId 参数的新值,则使用SET @UserId


鉴于您接受第二个条件是正确的,您可以编写的查询(无需更改此查询之外的任何内容)是:

@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0
    BEGIN
        SELECT 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END

【讨论】:

  • 嗨,我尝试设置第二部分来设置@UserId,但这也不起作用
  • @andrewslaughter 查看我的编辑。这两个条件现在都使用SELECT,它将在您的结果集中返回一个值。查看您的问题,您似乎就是从这个查询中访问值的方式
【解决方案2】:

我可以推荐对未来索引值进行预初始化,这在很多情况下非常有用,比如多工作,一些导出等。

只需创建额外的User_Seq 表: 有两个字段:id Uniq indexSeqVal nvarchar(1)

并创建下一个 SP,并从该 SP 生成 ID 值并放入新的用户行!

CREATE procedure [dbo].[User_NextValue]
as
begin
    set NOCOUNT ON


    declare @existingId int = (select isnull(max(UserId)+1, 0)  from dbo.User)

    insert into User_Seq (SeqVal) values ('a')
    declare @NewSeqValue int = scope_identity()     

    if @existingId > @NewSeqValue 
    begin  

        set identity_insert User_Seq  on
        insert into User_Seq (SeqID) values (@existingId)     
        set @NewSeqValue = scope_identity()     
    end

    delete from User_Seq WITH (READPAST)

return @NewSeqValue

end

【讨论】:

  • MSDN 有一个建议:另外你应该避免使用返回码来返回应用程序数据。
【解决方案3】:

尝试以这种方式调用您的 proc:

DECLARE @UserIDout int

EXEC YOURPROC @EmailAddress = 'sdfds', @NickName = 'sdfdsfs', ..., @UserId = @UserIDout OUTPUT

SELECT @UserIDout 

【讨论】:

  • @AndreyGurinov 我不明白这将如何解决问题。对于第二个条件,UserId 仍然为 NULL。
  • 您好,谢谢如果我从对象资源管理器中执行存储过程并将参数放入第一次运行它,我会进入结果窗格(没有列名)64(这是最后一个插入用户id) &UserId NULL Return Value 0 如果我再次运行它,我只会得到 &UserId 0 return value 0
  • 这帮助我弄清楚了如何调用存储过程
【解决方案4】:
@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
DECLARE @AA INT
SET @AA=(SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress)

IF @AA> 0
    BEGIN
        SET @UserId = 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多