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 に答える