2012-03-30 23 views
9

Tôi đã có các dòng dưới đây trong mệnh đề where truy vấn của tôi, nhưng tôi tiếp tục nhận được lỗi này:SQL charindex ném tham số chiều dài không hợp lệ được chuyển đến hàm LEFT hoặc SUBSTRING vì dấu chấm?

Msg 537, Level 16, State 3, Line 3 
Invalid length parameter passed to the LEFT or SUBSTRING function. 

    SUBSTRING(
     [email], 
     1, 
     CHARINDEX('@',[email])-1 
    ) = 
    SUBSTRING(
     [email], 
     CHARINDEX('@',[email])+1, 
     CHARINDEX('.', [email]) 
    ) 

Các lỗi được có nguồn gốc từ CHARINDEX('.', [email])

Nếu tôi thay đổi thời gian để thư, Tôi không gặp lỗi. Mỗi bản ghi có một khoảng thời gian trong nó, và thậm chí nếu không, hàm charindex sẽ trả về 0, điều này sẽ không gây ra lỗi này. Tôi phải thiếu một cái gì đó đơn giản. Hãy giúp tôi!

EDIT.

Tôi đã thử ném nó bên trong một isnull, isnull(CHARINDEX('.', [email]), 1) chỉ trong trường hợp nó đã trở về null vì lý do nào đó, nhưng điều đó đã không hoạt động.

Trả lời

19

Các lỗi được có nguồn gốc từ

CHARINDEX('@',[email])-1 

Nếu không có biểu tượng @ trong dữ liệu, lợi nhuận charindex 0. Bạn trừ một từ đó để có được -1, đó là không hợp lệ trong hàm substring.

Hãy thử thay vào đó.

CHARINDEX('@',[email] + '@')-1 

Lực lượng này phải khớp, đảm bảo CharIndex sẽ luôn trả về giá trị> = 1, điều này sẽ khiến chức năng chuỗi con của bạn thành công.

+0

+1 Đây là điều duy nhất làm từ ... nhưng OP cho biết " Nếu tôi thay đổi thời gian thành một lá thư, tôi sẽ không gặp lỗi. " –

+1

Tôi hiểu, nhưng điều đó không thể đúng. Tham số thứ 2 có thể là số âm (mặc dù tôi thừa nhận điều đó là lạ). Tham số thứ 3 phải là "số nguyên dương". Điều này bao gồm 0. Cách duy nhất để có được tham số chiều dài không hợp lệ là có thông số thứ 3 là số âm (nhỏ hơn 0).Charindex không thể trả về một số âm, do đó, vấn đề không thể với hàm chuỗi con thứ 2, và PHẢI là tham số thứ 3 của hàm chuỗi con đầu tiên. –

+0

Cảm ơn! Bảng tôi đang chạy nó là cực kỳ lớn, vì vậy khi tôi chạy truy vấn với một lá thư ở vị trí của thời kỳ, kết quả bắt đầu populating cho một vài phút trước khi nó nhấn một mà không có biểu tượng @ và ném lỗi (xin lỗi, không bắt được điều này là do sự thiếu kiên nhẫn của tôi). Cảm ơn đã giúp đỡ! –

0

Tôi không chắc đây là vấn đề duy nhất của bạn. Tôi đoán rằng bạn đang cố gắng nhìn vào phần đầu tiên của một địa chỉ e-mail và so sánh nó với phần đầu tiên của miền. Ví dụ: nếu địa chỉ e-mail là "[email protected]" thì bạn đang tìm kiếm "tên" và "công ty". Chuỗi con không lấy 2 vị trí, phải mất vị trí và độ dài. Vì vậy để có được "công ty" bạn sẽ cần phải làm điều này:

SUBSTRING(
    [email], 
    CHARINDEX('@', [email]) + 1, 
    CHARINDEX('.', [email]) - CHARINDEX('@', [email]) - 1 
) 

+1 và -1 là để giải thích cho thực tế là CHARINDEX sẽ cung cấp cho bạn vị trí của các "@" vì vậy nó sẽ bao gồm " @" Trong kết quả.

Thật không may điều này sẽ không luôn hoạt động vì nếu bạn có địa chỉ như "[email protected]" thì vị trí của "first.last" đầu tiên. " sẽ nhỏ hơn vị trí của "@" dẫn đến số âm.

Vì vậy, bạn sẽ cần phải làm điều này: ""

SUBSTRING(
    [email], 
    CHARINDEX('@', [email]) + 1, 
    CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1 
) 

Điều này sẽ đảm bảo bạn đang tìm kiếm đầu tiên sau "@". Tuy nhiên, điều này vẫn không hoạt động nếu bạn không có "@" nhưng bạn có dấu "." (chẳng hạn như "invalidemail.companay.com"). Do đó, bạn có thể thực hiện giải pháp ở trên để thêm '@' vào cuối, nhưng cách tốt hơn sẽ là như sau:

SUBSTRING(
    [email], 
    CHARINDEX('@', [email]) + 1, 
    CASE WHEN 
     CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1 < 0 
    THEN 0 
    ELSE 
     CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1 
    END 
) 
Các vấn đề liên quan