2010-06-30 114 views
0

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

这是我到目前为止。它编译好,但执行时,我得到一个错误“错误转换数据类型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 [email protected]); 

    SELECT * FROM dbo.aspnet_UsersInRoles WHERE [email protected]; 
END 
+0

你不能只是将任何字符串转换为uniqueidentifier。看起来aspnet_Users.UserId就是这样一个字符串。 T-SQL CONVERT命令可以转换项目,但是如果UserId不是有效的唯一标识符,则可以做的事情不多。你需要重新评估你正在做的事情,并在那里做一些改变。 – 2010-06-30 18:13:45

回答

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 

此外,如果用户ID上aspnet_Users表格内不是唯一标识符你会得到你在描述错误您的帖子。

UPDATE

后双重检查的OP的代码,我意识到,错误不在变量赋值,它的WHERE子句。

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

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

+0

我试过,但我仍然收到相同的信息。 'aspnet_Users'的'UserId'字段绝对是'uniqueidentifier'。 – DisgruntledGoat 2010-06-30 17:12:23

+0

@DisgruntledGoat - 在仔细检查你的代码之后......你将@username作为UniqueIdentifier传入。我的猜测是aspnet_Users表中的UserName字段是varchar(因此是错误)。 – 2010-06-30 17:25:44

+0

你说得对,它是造成问题的'@ username'参数。感谢您的帮助和更好的SP语法:) – DisgruntledGoat 2010-06-30 21:38:01

1

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

您可以将您的SET/SELECT INTO的方式单一声明:

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

确定aspnet_Users.UserId数据类型是uniqueidentifier

您的查询可以简化为:

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

有没有需要传递的变量处理。

4

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