【问题标题】:Return value in stored procedure SQL Server存储过程 SQL Server 中的返回值
【发布时间】:2011-02-12 18:56:49
【问题描述】:

我正在尝试使用带有 ASP 的 SQL Server 存储过程:

ALTER  PROCEDURE [dbo].[user_insert]
    @firstName NVARCHAR(50) ,
    @lastName NVARCHAR(50) ,
    @cityid INT ,
    @email NVARCHAR(100) ,
    @password NVARCHAR(12) ,
    @Affiliate INT
AS 
    BEGIN
        DECLARE @index1 INT
        SET @index1 = 0                      
        IF ( NOT EXISTS ( SELECT    * FROM      dbo.tbl_users
                          WHERE     user_email = @email )  ) 
            BEGIN                                  
                INSERT  INTO dbo.tbl_users
                        ( user_first_name ,
                          user_last_name ,
                          city_id ,
                          user_email ,
                          user_password ,
                          Affiliate_id
                        )
                VALUES  ( @firstName ,
                          @lastName ,
                          @cityid ,
                          @email ,
                          @password ,
                          @Affiliate
                        )
                SET @index1 = ( SELECT  @@IDENTITY
            END
        RETURN @index1 
    END

ASP 是

Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.ActiveConnection = conn
oCmd.CommandText = "user_insert"
oCmd.CommandType = 4

oCmd.Parameters.Append oCmd.CreateParameter("firstName", 203, 1, 100, "1")
oCmd.Parameters.Append oCmd.CreateParameter("lastName", 203, 1, 100, "2" )
oCmd.Parameters.Append oCmd.CreateParameter("cityid", 3, 1, 2, 1)
oCmd.Parameters.Append oCmd.CreateParameter("email", 200, 1, 100, txtmail)
oCmd.Parameters.Append oCmd.CreateParameter("password", 203, 1, 12, "2" )
oCmd.Parameters.Append oCmd.CreateParameter("Affiliate", 3, 1, 3, 1)
oCmd.Parameters.Append oCmd.CreateParameter("@index1", 3, 2)
Set rs = oCmd.Execute
response.write oCmd.Parameters("@index1").Value &"<br>"
Set oCmd = Nothing

如果我在 SQL Server 终端中运行 SP,它可以工作,但是当我使用 asp 代码时,如果它是“新用户”,我不会得到任何返回“index1”的值

我能做什么?

【问题讨论】:

  • 也许您已经在表格中使用了该电子邮件,请检查这一点,因为当这是真的时,您的 SP 不会返回/执行任何操作
  • 我不会说 ASP,但通常我认为您需要创建一个带有特殊标志的参数,意思是“这是 SP 返回值参数”。不确定名称,但是当我在 Delphi 中使用 ADO 时,它总是命名为@RETURN_VALUE。有 ASP 背景的人当然应该在这方面提供更多帮助。

标签: sql sql-server stored-procedures asp-classic


【解决方案1】:

按照其他答案状态更改为 adParamReturnValue。

您还需要抑制第一个结果集,使用 SET NOCOUNT ON。你也应该停止使用@@IDENTITY,改用SCOPE_IDENTITY。

ALTER  PROCEDURE [dbo].[user_insert]
   @firstName nvarchar(50),
   @lastName nvarchar(50),
   @cityid int,
   @email nvarchar(100),
   @password nvarchar(12),
   @Affiliate int
AS BEGIN
   SET NOCOUNT ON

   IF (not EXISTS (SELECT * FROM dbo.tbl_users WHERE user_email=@email))
   begin                                  
      INSERT INTO dbo.tbl_users(user_first_name, user_last_name, city_id, user_email, user_password, Affiliate_id)          
      VALUES(@firstName, @lastName, @cityid, @email, @password, @Affiliate)

      --set
      RETURN SCOPE_IDENTITY()
   end

   RETURN 0
end

注意:你甚至可以省略最后的 RETURN 0,因为 0 是默认的返回结果。

【讨论】:

    【解决方案2】:

    你的参数方向是adParamOutput(2),但应该是adParamReturnValue(4):

    oCmd.Parameters.Append oCmd.CreateParameter("@index1", 3, 4)
    

    查看CreateParameter 使用的ParamDirctionEnum

    【讨论】:

    • 试试看。仍然返回 null
    • @user186585 - 尝试从参数名称中删除 @
    • 这就像返回值由于某种原因在一个新的记录集中
    • @user186585 - 您确实需要获得结果中的第一个记录集。请参阅此示例:support.microsoft.com/kb/194792
    • 问题是在一种情况下有一个记录集,而在另一种情况下有两个记录集。我怎样才能合并这个?
    猜你喜欢
    • 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
    相关资源
    最近更新 更多