2009-01-08 250 views
6

我有這種場景,我需要物理數據庫中的數據完整性。例如,我有一個變量@email_address VARCHAR(200),我想檢查@email_address的值是否爲電子郵件格式。任何人有任何想法如何檢查T-SQL格式?T-SQL:檢查電子郵件格式

非常感謝!

+0

可能重複的[Sql腳本來查找無效的電子郵件地址](http://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses) – Neolisk 2015-01-28 15:27:03

回答

17

我測試了以下查詢,其中包含許多不同的錯誤和有效的電子郵件地址。它應該完成這項工作。

IF (
    CHARINDEX(' ',LTRIM(RTRIM(@email_address))) = 0 
AND LEFT(LTRIM(@email_address),1) <> '@' 
AND RIGHT(RTRIM(@email_address),1) <> '.' 
AND CHARINDEX('.',@email_address ,CHARINDEX('@',@email_address)) - CHARINDEX('@',@email_address) > 1 
AND LEN(LTRIM(RTRIM(@email_address))) - LEN(REPLACE(LTRIM(RTRIM(@email_address)),'@','')) = 1 
AND CHARINDEX('.',REVERSE(LTRIM(RTRIM(@email_address)))) >= 3 
AND (CHARINDEX('[email protected]',@email_address) = 0 AND CHARINDEX('..',@email_address) = 0) 
) 
    print 'valid email address' 
ELSE 
    print 'not valid' 

它會檢查這些條件:

  • 嵌入空格
  • '@' 不能是電子郵件地址
  • 的第一個字符 ''不能是電子郵件地址的最後一個字符
  • 必須有'。'之後某處「@」
  • 的「@」符號被允許
  • 域名應該具有至少2個字符的擴展名結尾
  • 不能有模式,如「@」和「..」
+0

謝謝!我對你發佈的條件沒有一個想法。感謝你的回答! – jerbersoft 2009-01-09 00:12:57

+0

@splattne ...這個函數在mssql 2008上不起作用。它是在mssql 2012上工作的很好的函數,但在2008上不是這樣。 – IBM 2016-05-03 18:36:34

1

如果您使用SQL 2005或2008,您可能需要考慮編寫CLR存儲過程並使用.NET正則表達式引擎like this。如果您使用的是SQL 2000或更早版本,則可以使用VBScript腳本引擎的正則表達式like ths。您也可以使用擴展存儲過程like this

8

AFAIK沒有好辦法做到這一點。

電子郵件格式標準是如此複雜的解析器已知運行到數千行代碼,但即使您使用的是一個更簡單的表單,它會失敗一些晦澀但有效的地址,這本身不T-SQL支持正則表達式(再次,我不是100%),讓你有somethign像一個簡單的回退:

LIKE '%[email protected]_%_.__%'

..或相似。

我的感覺通常是,你不應該在最後時刻這樣做(儘管插入到數據庫中),你應該在第一個機會和/或公共網關(控制器實際上使SQL插入請求),順便說一句,你會有正則表達式的優勢,甚至可能是一個庫,它會爲你「進行真正的」驗證。

1

恐怕沒有簡單的方法在T-SQL中做到這一點。要驗證RFC 2822所允許的各種電子郵件地址,您需要使用正則表達式。

更多信息here

如果你想簡化它,你將需要定義你的範圍。