|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Yesterday @ 8:43 AM
Points: 103,
Visits: 381
|
|
|
|
|
|
SSC Rookie
      
Group: General Forum Members
Last Login: Tuesday, June 11, 2013 11:07 AM
Points: 42,
Visits: 172
|
|
Very nice.
I would make a couple of suggestions though. To avoid the loop looking at each individual character, use regular expressions to look for invalid characters:
IF ( @vParameter_Length = 0 OR CHARINDEX ('@', @vParameter) < 2 OR CHARINDEX ('.', @vParameter) < 2 OR CHARINDEX ('.@', @vParameter) <> 0 OR CHARINDEX ('..', @vParameter) <> 0 OR CHARINDEX ('.', REVERSE (@vParameter)) < 3 OR CHARINDEX ('.', @vParameter, CHARINDEX ('@',@vParameter)) = 0 OR RIGHT (@vParameter,1) = '@' OR @vParameter LIKE '%@%@%' OR @vParameter LIKE '%[!-*]%' OR @vParameter LIKE '%,%' OR @vParameter LIKE '%/%' OR @vParameter LIKE '%[:-?]%' OR @vParameter LIKE '%[[-^]%' OR @vParameter LIKE '%`%' OR @vParameter LIKE '%[{-~]%' )
Then if you are going to do it on an entire table, you can avoid the function altogether which would probably bring your SQL Server to its knees to have a function in the where clause of a select against a million row table. This query ran against an 800,000+ row table in about 4 seconds.
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Friday, June 14, 2013 7:16 AM
Points: 3,
Visits: 527
|
|
I found this code in Internet some time ago.
I modify to Sqlserver
create FUNCTION IsValidEmail (@Email varchar(100))
RETURNS bit AS BEGIN
Declare @Long Int, @Pos Int, @Bueno Bit, @Ext varchar(1000), @Letras varchar(100), @I Int
Set @Letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ@.-_0123456789' Set @Email = rtrim(ltrim(@Email)) Set @Long = Len(@Email) Set @Pos = CharIndex('@',@Email) Set @Bueno = 0
If not (@Long < 6 -- Muy corto (very short) Or @Pos = 0 -- No hay arrobas (no @s) Or CharIndex('@',@Email,CharIndex('@',@Email)+1) > 0 -- dos o mas arrobas (more than 1 @) Or CharIndex(left(@Email,1),'@.-_') > 0 -- No empieza por '@.-_' Or CharIndex(right(@Email,1),'@.-_') > 0 -- No termina en '@.-_' Or CharIndex('@.',@Email) > 0 or CharIndex('..',@Email) > 0 or CharIndex('.@',@Email) > 0) -- @. ó ..
Begin Set @Ext = '.COM.EDU.GOV.NET.BIZ.ORG.TV.INFO' + '.AF.AL.DZ.As.AD.AO.AI.AQ.AG.AP.AR.AM.AW.AU.AT.AZ.BS.BH.BD.BB.BY' + '.BE.BZ.BJ.BM.BT.BO.BA.BW.BV.BR.IO.BN.BG.BF.MM.BI.KH.CM.CA.CV.KY' + '.CF.TD.CL.CN.CX.CC.CO.KM.CG.CD.CK.CR.CI.HR.CU.CY.CZ.DK.DJ.DM.DO' + '.TP.EC.EG.SV.GQ.ER.EE.ET.FK.FO.FJ.FI.CS.SU.FR.FX.GF.PF.TF.GA.GM.GE.DE' + '.GH.GI.GB.GR.GL.GD.GP.GU.GT.GN.GW.GY.HT.HM.HN.HK.HU.IS.IN.ID.IR.IQ' + '.IE.IL.IT.JM.JP.JO.KZ.KE.KI.KW.KG.LA.LV.LB.LS.LR.LY.LI.LT.LU.MO.MK.MG' + '.MW.MY.MV.ML.MT.MH.MQ.MR.MU.YT.MX.FM.MD.MC.MN.MS.MA.MZ.NA' + '.NR.NP.NL.AN.NT.NC.NZ.NI.NE.NG.NU.NF.KP.MP.NO.OM.PK.PW.PA.PG.PY' + '.PE.PH.PN.PL.PT.PR.QA.RE.RO.RU.RW.GS.SH.KN.LC.PM.ST.VC.SM.SA.SN.SC' + '.SL.SG.SK.SI.SB.SO.ZA.KR.ES.LK.SD.SR.SJ.SZ.SE.CH.SY.TJ.TW.TZ.TH.TG.TK' + '.TO.TT.TN.TR.TM.TC.TV.UG.UA.AE.UK.US.UY.UM.UZ.VU.VA.VE.VN.VG.VI' + '.WF.WS.EH.YE.YU.ZR.ZM.ZW' Set @Pos = @Long + 1 - CharIndex('.',Reverse(@Email)) -- localiza el último punto (locate last period) If CharIndex(substring(@Email, @Pos,60), @Ext) > 0 -- Chequea terminación válida Begin Set @I = 1 While @I <= @Long Begin If CharIndex(Substring(@Email,@I,1),@Letras) = 0 -- Letra o caracter inválido (invalid char) Break Set @I = @I + 1 End End
If @Long < @I Set @Bueno = 1
End
Return @Bueno
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Yesterday @ 8:43 AM
Points: 103,
Visits: 381
|
|
| Very nice! Thanks for all of the helpful tips and tricks. :)
|
|
|
|
|
SSC Rookie
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 12:18 PM
Points: 27,
Visits: 102
|
|
Dennis, I like your pattern matching approach. However, I was concerned about the 128 extended characters, so I suggest the last condition be modified to changed the ~ to a ÿ, like this:
OR @vParameter LIKE '%[{-ÿ]%'
Sincerely, Daniel
|
|
|
|
|
SSC Rookie
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 12:18 PM
Points: 27,
Visits: 102
|
|
Oops, ÿ doesn't work
Sincerely, Daniel
|
|
|
|
|
SSC Rookie
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 12:18 PM
Points: 27,
Visits: 102
|
|
OK, here's the fix for ÿ:
OR @vParameter COLLATE Latin1_General_BIN LIKE '%[{-ÿ]%'
Sincerely, Daniel
|
|
|
|
|
SSC Rookie
      
Group: General Forum Members
Last Login: Wednesday, January 02, 2013 12:06 PM
Points: 37,
Visits: 206
|
|
Thanks Sean! I believe this is a lot more inclusive than the edits I’d coded in my script. Libby Montgomery
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Yesterday @ 8:43 AM
Points: 103,
Visits: 381
|
|
|
|
|