Sql server 返回布尔值的存储过程

Sql server 返回布尔值的存储过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在创建一个存储过程,用于检查用户保存的电子邮件是否为编辑配置文件电子邮件,以检查数据库中是否已存在其他用户的新电子邮件。如果输入的电子邮件不存在于数据库中,则可以安全地使用和保存,但如果它存在于数据库中,并且用户id和名称与保存人的用户id和名称不匹配,则意味着新电子邮件属于另一个用户。返回false,我将使用它抛出错误消息 以下是我所拥有的: create procedure CheckDuplicate @email nvarchar(256), @Id int As Begin set

我正在创建一个存储过程,用于检查用户保存的电子邮件是否为编辑配置文件电子邮件,以检查数据库中是否已存在其他用户的新电子邮件。如果输入的电子邮件不存在于数据库中,则可以安全地使用和保存,但如果它存在于数据库中,并且用户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来检查数据库中是否存在bool?

试试以下方法:

--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
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
试试这个:

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

如果其他用户具有请求的电子邮件地址,则返回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
这在某种程度上更有效,因为不需要创建记录集来传递单个位


请注意,这实际上应该在更新数据库的同一事务中完成。否则,其他人可能会潜入,您将发生冲突。

如果其他用户具有请求的电子邮件地址,则返回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
这在某种程度上更有效,因为不需要创建记录集来传递单个位


请注意,这实际上应该在更新数据库的同一事务中完成。否则,其他人可能会潜入,您将发生冲突。

如果不打印“是”或“否”,只会返回0或实际的用户信息,具体取决于我在返回1中传递的内容(是)和0(否)。。您可以根据需要修改代码。在日志文件或SSMS中使用打印语法进行打印。如果不打印“是”或“否”,只会返回0或实际用户信息,具体取决于我在返回1中传递的内容(是),在返回0中传递的内容(否)。。您可以根据需要修改代码。在日志文件或SSMS中使用打印语法打印。这样,我就可以在我的web应用程序c asp.net mvc中使用它来检查是否为false,然后我可以使用它,如果为true,则不能使用它?是的,存储过程返回的值将是布尔值,在返回存储过程结果时,您需要读取此值。这与在SQL列中选择一个布尔位并将其作为结果集的一部分返回的概念相同。这样,我就可以在我的web应用程序c asp.net mvc中使用它来检查是否为false,然后我可以使用它,如果为true,则不能使用它?是的,存储过程返回的值将是布尔值,返回存储过程结果时,需要读取此值。这与在SQL列中选择一个布尔位并将其作为结果集的一部分返回的概念相同。我相信问题是:这个@email地址是否属于除此用户@Id之外的任何人?如果它是未分配的,或属于相关用户,则可以对其进行更新。如果它已经属于另一个用户,则存在问题。当前的答案并不都实现这一逻辑。@哈博:是的,您对问题的理解是正确的-我想检查用户正在更新的电子邮件是否存在于数据库中,是否存在于其他用户-如果是,请返回true,该电子邮件已被接收,其他错误未接收,可以使用我相信问题是:此@电子邮件地址是否属于其他用户这个用户@Id?如果它是未分配的,或属于相关用户,则可以对其进行更新。如果它已经属于另一个用户,则存在问题。当前的答案并不都实现这一逻辑。@哈博:是的,您对问题的理解是正确的-我想检查用户正在更新的电子邮件是否存在于数据库中给另一个用户-如果是,请返回“真”该电子邮件已被接收,否则返回“假”不被接收,并且在返回“假”时可以使用,因为该电子邮件已被接收并被视为重复我得到false,这是正确的结果,但我也看到ResultValue=0。对于现有的电子邮件地址,ResultValue不应该为1吗?我计算的结果,emailbelongstotheruser,与您预期的相反。你是如何获得结果价值的?可以使用获取第一个存储过程的结果。您确定没有获取该过程的退出状态吗?如果没有错误,则始终为0。当我返回false,表示电子邮件已被接收并被视为重复邮件时,我得到false,这是正确的结果,但我也看到ResultValue=0。对于现有的电子邮件地址,ResultValue不应该为1吗?我计算的结果,emailbelongstotheruser,与您预期的相反。你是如何获得结果价值的?可以使用获取第一个存储过程的结果。您确定没有获取该过程的退出状态吗?如果没有错误,则始终为0。