2

我正在创建一个存储过程,用于检查用户是否保存的电子邮件(编辑个人资料电子邮件)以检查数据库中是否已存在其他用户的新电子邮件。如果输入的电子邮件在数据库中不存在,则可以安全使用和保存,但如果它存在于数据库中并且用户 ID 和名称与保存人的用户 ID 和名称不匹配,则意味着新电子邮件属于不同的用户返回 false 我将使用它来抛出和错误消息

这是我所拥有的:

create procedure CheckDuplicate
@email nvarchar(256),
@Id int
As
Begin
set nocount on;
select usr.Id, usr.UserName, usr.Email
from Users usr
where usr.Email = @email and usr.Id = @Id
end

问题: 如何添加 bool 来检查它是否存在于数据库中?

4

3 回答 3

2

尝试这个:

create procedure CheckDuplicate
@email nvarchar(256),
@Id int
As
Begin

set nocount on;

   Select Case When Exists (
      select usr.Id, usr.UserName, usr.Email
      from Users usr
      where usr.Email = @email and usr.Id = @Id
   )
   Then Cast(1 as bit)
   Else Cast(0 as bit) 
   End


End
于 2013-09-11T17:22:10.387 回答
2

如果另一个用户有请求的电子邮件地址,这将返回 1,否则返回 0:

create procedure CheckDuplicate
  @email nvarchar(256),
  @Id int
As
  set nocount on;
  select case
    when exists ( select 42 from Users where Email = @email and Id <> @Id ) then Cast( 1 as Bit )
    else Cast( 0 as Bit ) end as EmailBelongsToAnotherUser

或者,您可以在输出参数中返回结果:

create procedure CheckDuplicate
  @email nvarchar(256),
  @Id int,
  @EmailCollision as Bit Output
As
  set nocount on;
  select @EmailCollision = case
    when exists ( select 42 from Users where Email = @email and Id <> @Id ) then Cast( 1 as Bit )
    else Cast( 0 as Bit ) end as EmailBelongsToAnotherUser

这在某种程度上更有效,因为不需要创建记录集来传递单个位。

请注意,这实际上应该在更新数据库的同一事务中完成。否则其他人可能会偷偷溜进来,你就会发生冲突。

于 2013-09-11T17:34:17.867 回答
0
--IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')

create procedure CheckDuplicate
@email nvarchar(256),
@Id int
As
Begin
set nocount on;
IF EXISTS (select usr.Id, usr.UserName, usr.Email
from Users usr
where usr.Email = @email and usr.Id = @Id)
begin
Print 'YES' 
end
else
begin
Print 'NO' 
end

end
于 2013-09-11T17:20:01.213 回答