我有一个带有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
答案 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
无需传递变量处理。