2013-05-31 36 views
9

Mam nadzieję, że nie wydaje się to zbyt proste. Sprawdziłem to, ale nie jestem tak dobry w funkcjach zdefiniowanych przez użytkownika SQL i ich używaniu, więc nie jestem pewien co się dzieje. Kto wyobraża kilka punktów za mówienie mi, dlaczego ja dostaję błąd:Uruchamianie funkcji zdefiniowanej przez użytkownika SQL, która zwraca wartość boolean, gdzie klauzula

An expression of non-boolean type specified in a context where a condition is expected, near ')'.

dla tego:

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') 

gdzie funkcja może być stworzony przy pomocy:

-- ***this will also find NULL and empty string values*** 
CREATE FUNCTION LMI_IsSingleCharacterRepeated (@string varchar(max), @char char(1)) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @index int 
    DECLARE @len int 
    DECLARE @currentChar char(1) 
    SET @index = 1 
    SET @len= LEN(@string) 

    WHILE @index <= @len 
    BEGIN 
     SET @currentChar = SUBSTRING(@string, @index, 1) 
     IF @currentChar = @char 
      SET @index= @index+ 1 
     ELSE 
      RETURN 0 
    END 
    RETURN 1 
END; 
GO 

Ta funkcja służy do sprawdzania, czy ciąg znaków jest dowolnym określonym pojedynczym znakiem, powtórzony. Mam nadzieję, że ktoś uzna to za przydatne!

+0

ostrożność - moja funkcja będzie również znaleźć pól z wartościami null lub pusty ciąg, tak naprawdę potrzebuje trochę więcej pracy –

Odpowiedz

17

Musisz użyć operatorów porównania przed funkcji, nawet jeśli typ zwracany jest bit.

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1 
3

Try This

CREATE FUNCTION LMI_IsSingleCharacterRepeated (@str varchar(max), @char char(1)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @indx int 
    DECLARE @len int 
    DECLARE @currentChar char(1) 
    SET @indx = 1 
    SET @len= LEN(@str) 

    WHILE @indx <= @len 
    BEGIN 
     SET @currentChar = SUBSTRING(@str, @indx, 1) 
     IF @currentChar = @char 
      SET @indx= @indx+ 1 
     ELSE 
      RETURN 0 
    END 
    RETURN 1 
END; 
GO 
+0

Thanks za sugestię. Próbowałem tego, ale boolean nie jest rozpoznanym typem danych. Używam SQL Server 2008 R2 –

+1

Zaktualizowany ponownie. Proszę sprawdzić. – Ravi

+1

Dobre myślenie i jeszcze raz dziękuję. Wykorzystanie zarezerwowanych słów w zapytaniu może łatwo wychwycić programistę. W moim przypadku nie był to problem. Upoważniłem tę sugestię jako przydatną :) –

4

Trzeba zmodyfikować klauzuli WHERE zapytania jak:

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1 
+0

Dzięki Nikhil - właśnie pobity do odpowiedzi Tomasza, więc dałem ci awans –