電子メール アドレスを検証する正規表現は 100 万通りありますが、Sql Server 2005 の TSQL クエリに統合できる基本的な電子メール検証はどうでしょうか。
CLR プロシージャまたは関数を使用したくありません。単純な TSQL です。
誰かがすでにこれに取り組んでいますか?
電子メール アドレスを検証する正規表現は 100 万通りありますが、Sql Server 2005 の TSQL クエリに統合できる基本的な電子メール検証はどうでしょうか。
CLR プロシージャまたは関数を使用したくありません。単純な TSQL です。
誰かがすでにこれに取り組んでいますか?
非常に基本的なものは次のとおりです。
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 の文字どおりの照合でさえ、ほとんどの電子メール システムで受け入れられない、または使用されないアドレス構造に一致します。
いずれにせよ、データベース レベルでこれを行うのは間違ったアプローチかもしれません。そのため、上記の基本的なサニティ チェックは、パフォーマンスに関して得られる最善の方法である可能性があり、アプリケーションでこれを行うと、はるかに優れた柔軟性が得られます。
これはもう少し詳細なサンプル関数です。これをどこから取得したか(数年前)、または変更した場合は、適切な属性を含めます。
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
素晴らしい答えです!これらの推奨事項に基づいて、最良の 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
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
これは、それらを選択する最も簡単な方法です。
このクエリを使用
SELECT * FROM <TableName> WHERE [EMail] NOT LIKE '%_@__%.__%'
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
トマラクの選択から
select 1
where @email not like '%[^a-z,0-9,@,.]%'
and @email like '%_@_%_.__%'