检查用户是否存在于数据库中的最有效方法是什么?

时间:2013-12-05 13:24:33

标签: asp.net sql sql-server database

我正在构建一个与SQL Server一起使用的.NET站点的用户注册。

我已经编写了一个存储过程来插入新用户。在插入之前,我想确保用户尚未注册。

用户名是他的电子邮件地址,在插入之前我正在进行以下检查:

IF EXISTS (SELECT 1 FROM dbo.Members WHERE _Email = @Email)
    BEGIN
         SELECT @UsernameAlreadyInUse
         RETURN @UsernameAlreadyInUse
    END
这是一个好方法吗?如果我有很多用户不会对我的表进行全面扫描并且实际上很慢?这种情况的最佳做法是什么?

由于

2 个答案:

答案 0 :(得分:1)

如果您只想打一次数据库,可以选择以下方法。

您尝试INSERT,并跟踪@@ ROWCOUNT。

你的决定应该基于你是否认为“碰撞”是普通的,或者是罕见的。

我喜欢下面的内容,因为我觉得碰撞不会经常发生。 我得到“检查”和(可能的?)INSERT工作.........与一个db命中。

说完.......如果您使用MembershipProvider,我强烈建议您使用库中的方法来完成您需要做的事情。而不是直接处理数据库。 它是一个MembershipProvider模型,并且存在,因此您可以将“具体”实现(SqlMembershipProvider(下面的URL))换成另一个实现最少的更改。

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider%28v=vs.110%29.aspx

/* START TSQL */

if exists ( SELECT * FROM information_schema.tables WHERE table_schema = 'dbo' and table_name = 'UserInfo' )
      BEGIN
            print 'About to DROP TABLE [dbo].[UserInfo]'
            DROP TABLE [dbo].[UserInfo]
            print 'TABLE [dbo].[UserInfo] dropped'
            print ''
      END
GO



CREATE TABLE [dbo].[UserInfo] (
      UserInfoUUID [uniqueidentifier] not null default NEWSEQUENTIALID() ,
      EmailAddress varchar(64) not null
)    
GO


ALTER TABLE dbo.UserInfo ADD CONSTRAINT PK_UserInfo_UserInfoUUID
PRIMARY KEY CLUSTERED (UserInfoUUID)
GO


ALTER TABLE dbo.UserInfo ADD CONSTRAINT CK_UserInfo_UserInfoName_UNIQUE
UNIQUE (EmailAddress)
GO


SET NOCOUNT ON 


declare @MyRowCount bigint
declare @UsernameAlreadyInUse bit
declare @EmailAddress varchar(64)
select @EmailAddress = 'bill@ms.com'


INSERT INTO [dbo].[UserInfo] ( EmailAddress ) 
Select @EmailAddress  where not exists (select null from dbo.UserInfo innerUI where innerUI.EmailAddress = @EmailAddress)
select @MyRowCount = @@ROWCOUNT

Select @UsernameAlreadyInUse = 0
if (@MyRowCount = 0)
BEGIN
    select @UsernameAlreadyInUse = 1
END

select * from [dbo].[UserInfo]

print '1st @UsernameAlreadyInUse'
print @UsernameAlreadyInUse
print ''


INSERT INTO [dbo].[UserInfo] ( EmailAddress ) 
Select @EmailAddress  where not exists (select null from dbo.UserInfo innerUI where innerUI.EmailAddress = @EmailAddress)
select @MyRowCount = @@ROWCOUNT

Select @UsernameAlreadyInUse = 0
if (@MyRowCount = 0)
BEGIN
    select @UsernameAlreadyInUse = 1
END

select * from [dbo].[UserInfo]

print '2nd @UsernameAlreadyInUse'
print @UsernameAlreadyInUse
print ''



SET NOCOUNT OFF

答案 1 :(得分:0)

IF EXISTS (SELECT Name FROM dbo.Members WHERE _Email = @Email)
    BEGIN
         RAISERROR('User Already Exist',16,1)         
    END