2009-01-08 64 views
6

Tôi có tình huống này khi tôi cần toàn vẹn dữ liệu trong cơ sở dữ liệu vật lý. Ví dụ: tôi có một biến là @email_address VARCHAR(200) và tôi muốn kiểm tra xem giá trị của @email_address có phải là định dạng email không. Bất cứ ai có bất kỳ ý tưởng làm thế nào để kiểm tra định dạng trong T-SQL?T-SQL: kiểm tra định dạng email

Rất cám ơn!

+0

có thể trùng lặp của [Sql script để tìm địa chỉ email không hợp lệ] (http://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses) – Neolisk

Trả lời

17

Tôi đã thử nghiệm truy vấn sau với nhiều địa chỉ email sai và hợp lệ khác nhau. Nó nên thực hiện công việc.

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' 

Nó kiểm tra các điều kiện:

  • Không có dấu cách nhúng
  • '@' không thể là ký tự đầu tiên của một địa chỉ email
  • '' không được là ký tự cuối cùng của địa chỉ email
  • Phải có dấu '.' ở đâu đó sau '@'
  • dấu '@' được phép
  • tên miền nên kết thúc với phần mở rộng nhân vật ít nhất 2
  • không thể có các mẫu như '@' và '..'
+0

cảm ơn! tôi không có ý tưởng về các điều kiện bạn đã đăng. cảm ơn cho câu trả lời! – jerbersoft

+0

@splattne ...chức năng này không làm việc trên mssql 2008. nó là chức năng tuyệt vời làm việc trên mssql 2012 nhưng không phải trên 2008 – IBM

1

Nếu bạn sử dụng SQL 2005 hoặc 2008, bạn có thể muốn xem xét viết các bản sao lưu CLR và sử dụng công cụ .NET regex like this. Nếu bạn đang sử dụng SQL 2000 hoặc cũ hơn, bạn có thể sử dụng biểu thức chính quy của VBScript script like ths. Bạn cũng có thể sử dụng một thủ tục được lưu trữ mở rộng like this

8

AFAIK không có cách nào tốt để thực hiện việc này.

Tiêu chuẩn định dạng email là các trình phân tích cú pháp phức tạp đã được biết là chạy tới hàng nghìn dòng mã, nhưng ngay cả khi bạn sử dụng một biểu mẫu đơn giản hơn sẽ làm thất bại một số địa chỉ mơ hồ nhưng hợp lệ mà bạn phải thực hiện biểu thức thông thường mà không natively hỗ trợ bởi T-SQL (một lần nữa, tôi không phải là 100% trên đó), để lại cho bạn một dự phòng đơn giản của somethign như:

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

..or tương tự. Cảm giác của tôi nói chung là bạn không thể làm điều này ở thời điểm cuối cùng (khi bạn đưa vào DB), bạn nên làm điều đó ở cơ hội đầu tiên và/hoặc một cổng thông thường (bộ điều khiển thực sự làm cho yêu cầu chèn SQL), trong đó tình cờ bạn sẽ có lợi thế của regex, và thậm chí có thể là một thư viện thực hiện xác thực "thực" cho bạn.

+0

Để xác nhận cơ bản này sẽ làm. –

1

Không có cách nào dễ dàng để làm điều đó trong T-SQL, tôi sợ. Để xác thực tất cả các loại địa chỉ email được cho phép bởi RFC 2822, bạn sẽ cần phải sử dụng cụm từ thông dụng.

Thông tin thêm here.

Bạn sẽ cần phải xác định phạm vi của mình, nếu bạn muốn đơn giản hóa nó.

Các vấn đề liên quan