2012-03-30 11 views
9

Mam wiersze poniżej w klauzuli WHERE mojego zapytania, ale wciąż otrzymuję ten błąd:SQL charindex throwing Niepoprawny parametr długości przekazany do funkcji LEFT lub SUBSTRING z powodu okresu?

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]) 
    ) 

Błąd jest pochodzący z CHARINDEX('.', [email])

Jeśli zmienić ten okres do listu, Nie widzę błędu. Każdy zapis zawiera okres, a nawet jeśli nie, funkcja charindex zwróci 0, co nie spowoduje błędu. Muszę przegapić coś prostego. Proszę pomóż!

EDYCJA.

Próbowałem rzucić go wewnątrz isnull, isnull(CHARINDEX('.', [email]), 1) na wypadek, gdyby z jakiegoś powodu zwracał wartość zerową, ale to też nie działało.

Odpowiedz

19

Błąd jest pochodząca z

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

Jeśli nie ma symbolu @ w danych, powraca charIndex 0. odjąć jeden z, że aby uzyskać -1, co jest nieważny w funkcji podciągu.

Spróbuj tego zamiast tego.

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

tym nie siły być mecz, upewniając CHARINDEX zawsze zwraca wartość> = 1, która spowoduje, że funkcja podciąg, aby odnieść sukces.

+0

+1 Jest to jedyna rzecz, która od czasu ... ale PO powiedział " Jeśli zmienię ten okres na list, nie otrzymam błędu. " –

+1

Rozumiem, ale to nie może być prawda. Drugi parametr może być liczbą ujemną (chociaż przyznaję, że to dziwne). Trzeci parametr musi być "dodatnią liczbą całkowitą". Obejmuje to 0. Jedynym możliwym sposobem uzyskania nieprawidłowego parametru długości jest uzyskanie ujemnego parametru 3 (mniej niż 0).Charindex nie może zwrócić liczby ujemnej, więc problem nie może dotyczyć funkcji drugiego podłańcucha i MUSI być trzecim parametrem pierwszej funkcji podłańcuchowej. –

+0

Dzięki! Stół, na którym go uruchomiłem, jest bardzo duży, więc gdy uruchomiłem zapytanie z literą w miejscu okresu, wyniki zaczęły się zapełniać przez kilka minut, zanim trafiły w jedno bez symbolu @ i spowodowały błąd (przepraszam, nie złapanie tego było spowodowane moją niecierpliwością). Dzięki za pomoc! –

0

Nie jestem pewien, czy to twój jedyny problem. Zgaduję, że próbujesz spojrzeć na pierwszą część adresu e-mail i porównać go z pierwszą częścią domeny. Na przykład, jeśli adres e-mail to "[email protected]", wówczas szukasz "nazwy" i "firmy". Podłoże nie zajmuje 2 pozycji, zajmuje pozycję i długość. Dlatego, aby uzyskać „spółka” trzeba by to zrobić:

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

+1 i -1 są w celu uwzględnienia faktu, że CHARINDEX dałaby ci pozycję „@” tak byłoby zaliczyć " @ "w wyniku.

Niestety to nie zawsze działa, ponieważ jeśli masz adres taki jak "[email protected]", to pozycja pierwszego "." będzie mniejsze niż pozycja "@", co daje liczbę ujemną.

Dlatego trzeba będzie to zrobić „”

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

Byłoby to upewnić szukasz pierwszy po "@". Jednak nadal nie działa, jeśli nie masz znaku "@", ale masz znak "." (na przykład "invalidemail.companay.com"). Abyś mógł zrobić powyższe rozwiązanie, aby dodać "@" do końca, ale lepszy sposób byłby taki:

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 
) 
Powiązane problemy