30

電子メール アドレスを検証する正規表現は 100 万通りありますが、Sql Server 2005 の TSQL クエリに統合できる基本的な電子メール検証はどうでしょうか。

CLR プロシージャまたは関数を使用したくありません。単純な TSQL です。

誰かがすでにこれに取り組んでいますか?

4

9 に答える 9

54

非常に基本的なものは次のとおりです。

SELECT
  EmailAddress, 
  CASE WHEN EmailAddress LIKE '%_@_%_.__%' 
            AND EmailAddress NOT LIKE '%[any obviously invalid characters]%' 
  THEN 'Could be' 
  ELSE 'Nope' 
  END Validates
FROM 
  Table

これは、中央に @ があり、前に少なくとも 1 文字、その後に少なくとも 2 文字、ドット、および TLD の少なくとも 2 文字が続くすべてのものに一致します。

より具体的なことを行うパターンをさらに作成することLIKEはできますが、電子メール アドレスである可能性のあるすべてのものに一致させることはできず、そうでないものを見逃すことはできません。正規表現を使用しても、正しく行うのは困難です。さらに、RFC の文字どおりの照合でさえ、ほとんどの電子メール システムで受け入れられない、または使用されないアドレス構造に一致します。

いずれにせよ、データベース レベルでこれを行うのは間違ったアプローチかもしれません。そのため、上記の基本的なサニティ チェックは、パフォーマンスに関して得られる最善の方法である可能性があり、アプリケーションでこれを行うと、はるかに優れた柔軟性が得られます。

于 2008-10-23T14:28:51.953 に答える
20

これはもう少し詳細なサンプル関数です。これをどこから取得したか(数年前)、または変更した場合は、適切な属性を含めます。

CREATE FUNCTION [dbo].[fnAppEmailCheck](@email VARCHAR(255))   
--Returns true if the string is a valid email address.  
RETURNS bit  
as  
BEGIN  
     DECLARE @valid bit  
     IF @email IS NOT NULL   
          SET @email = LOWER(@email)  
          SET @valid = 0  
          IF @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z][a-z]%'  
             AND LEN(@email) = LEN(dbo.fnAppStripNonEmail(@email))  
             AND @email NOT like '%@%@%'  
             AND CHARINDEX('.@',@email) = 0  
             AND CHARINDEX('..',@email) = 0  
             AND CHARINDEX(',',@email) = 0  
             AND RIGHT(@email,1) between 'a' AND 'z'  
               SET @valid=1  
     RETURN @valid  
END  
于 2009-08-28T07:28:40.820 に答える
3

素晴らしい答えです!これらの推奨事項に基づいて、最良の 2 つの回答を組み合わせた単純化された関数を思い付きました。

CREATE FUNCTION [dbo].[fnIsValidEmail]
(
    @email varchar(255)
)   
--Returns true if the string is a valid email address.  
RETURNS bit  
As  
BEGIN
    RETURN CASE WHEN ISNULL(@email, '') <> '' AND @email LIKE '%_@%_.__%' THEN 1 ELSE 0 END
END
于 2016-05-27T19:47:44.230 に答える
1

FnAppStripNonEmail がスコアの下にありません。キープ値に追加する必要があります

Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^a-z,0-9,_,@,.,-]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
End
于 2016-02-02T17:39:51.470 に答える
0

これは、それらを選択する最も簡単な方法です。

このクエリを使用

SELECT * FROM <TableName> WHERE [EMail] NOT LIKE '%_@__%.__%'
于 2015-03-10T11:23:49.903 に答える
0
Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^a-z,0-9,@,.,-]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
End
于 2014-09-22T16:38:00.310 に答える
-2

トマラクの選択から

select 1
where @email not like '%[^a-z,0-9,@,.]%'
and @email like '%_@_%_.__%'
于 2010-05-11T10:19:00.793 に答える