代码之家  ›  专栏  ›  技术社区  ›  DisgruntledGoat

在存储过程中存储查询中的变量

  •  0
  • DisgruntledGoat  · 技术社区  · 15 年前

    我有一个带有username参数的存储过程。我想使用一个查询来获取一个userid,然后在进一步的查询中使用这个变量。

    ALTER PROCEDURE [dbo].[sp_User_delete]
        @username uniqueidentifier
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @UserId uniqueidentifier;
    
        -- I guess I need to do something here to convert the ID
        SET @UserId = 
            (SELECT UserId FROM aspnet_Users WHERE UserName=@username);
    
        SELECT * FROM dbo.aspnet_UsersInRoles WHERE UserId=@UserId;
    END
    
    4 回复  |  直到 15 年前
        1
  •  4
  •   Justin Niessner    15 年前
    -- Proper way to set a variable, will only work properly if one row is returned
    SELECT @UserId = UserId 
    FROM aspnet_Users 
    WHERE UserName = @username
    

    更新

    在仔细检查了OP的代码之后,我意识到错误不在变量赋值中,而是在WHERE子句中。

    aspnet\u Users表中的UserName字段可能是VARCHAR,SP的@UserName param是uniqueidentifier。

    尝试将@username改为varchar,看看语句是否有效。

        2
  •  4
  •   joelt    15 年前

    这是我的直觉,但用户名列真的是唯一标识符吗?看起来这通常是一个varchar,所以问题可能是@username参数的类型…也许也应该是varchar。

        3
  •  1
  •   Joe    15 年前

    aspnet\u用户中UserId的数据类型是什么?

    您可以通过以下方式将SET/SELECT组合成一个语句:

    SELECT @UserId = UserId FROM aspnet_Users WHERE UserName = @username;
    
        4
  •  1
  •   OMG Ponies    15 年前

    你确定 aspnet_Users.UserId 数据类型为 uniqueidentifier ?

    您的查询可以简化为:

    SELECT * 
      FROM dbo.aspnet_UsersInRoles uir
      JOIN aspnet_Users au ON au.userid = uir.userid
     WHERE au.UserName = @username
    

    不需要传递变量处理。