存储来自存储过程中的查询的变量

时间:2010-06-30 17:00:18

标签: sql-server stored-procedures variables

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

这是我到目前为止所拥有的。它编译正常,但在执行时我收到错误“将数据类型varchar转换为uniqueidentifier时出错。”

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 个答案:

答案 0 :(得分:4)

-- Proper way to set a variable, will only work properly if one row is returned
SELECT @UserId = UserId 
FROM aspnet_Users 
WHERE UserName = @username

此外,如果aspnet_Users表上的UserId不是UniqueIdentifier,您将收到您在帖子中描述的错误。

<强>更新

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

aspnet_Users表中的UserName字段可能是VARCHAR,SP的@username参数是uniqueidentifier。

尝试将@username更改为varchar并查看该语句是否有效。

答案 1 :(得分:4)

这只是我的直觉,但UserName列真的是一个独特的标识符吗?看起来这通常是一个varchar,所以问题可能是你的@username参数的类型......也许这应该是varchar。

答案 2 :(得分:1)

aspnet_users中UserId的数据类型是什么?

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

SELECT @UserId = UserId FROM aspnet_Users WHERE UserName = @username;

答案 3 :(得分:1)

您确定aspnet_Users.UserId数据类型是uniqueidentifier吗?

您的查询可以简化为:

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

无需传递变量处理。