存储过程 SQL Server 中的返回值

8

我正在尝试使用SQL Server存储过程与ASP:

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 终端中运行存储过程是有效的,但当我使用 ASP 代码时,如果是“新用户”,则没有任何值返回“index1”,该怎么办?


也许您在表中已经有使用该电子邮件的用户,请检查一下,因为当这种情况为真时,您的SP不会返回/执行任何操作。 - Kris Ivanov
我不会说ASP,但通常情况下,我认为您需要创建一个带有特殊标志的参数,表示“这是SP返回值参数”。不确定名称,但当我在Delphi中使用ADO时,它总是被命名为@RETURN_VALUE。有ASP背景的人肯定可以在这方面提供更多帮助。 - Andriy M
2个回答

8

如其他答案所述,将其更改为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)

查看ParamDirctionEnum,该枚举类型用于CreateParameter方法。


尝试一下。仍然返回 null。 - user186585
尝试从参数名称中删除@ - Oded
某些原因似乎返回值在一个新记录集中。 - user186585
@user186585 - 你需要获取结果中的第一个记录集。请参考此示例:http://support.microsoft.com/kb/194792 - Oded
问题在于,在一种情况下有一个记录集,而在另一种情况下有两个记录集。我该如何合并它们? - user186585

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接