2013-05-31 1 views
9

Hope das scheint nicht zu einfach. Ich habe nachgeschlagen, aber ich bin nicht so gut in SQL benutzerdefinierte Funktionen und deren Verwendung, so dass ich nicht sicher bin, was los ist. Wer glaubt, ein paar Punkte für das Erklären Sie mir, warum ich erhalte die Fehlermeldung:Ausführen von benutzerdefinierten SQL-Funktion, die Boolean zurückgibt, in WHERE-Klausel

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

Dazu:

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

, wo die Funktion kann folgendermaßen angelegt werden:

-- ***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 

Diese Funktion dient zum Überprüfen, ob eine Zeichenfolge ein bestimmtes einzelnes Zeichen ist, wiederholt. Hoffe jemand findet es nützlich!

+0

Vorsicht - meine Funktion auch Felder mit Nullwerten oder einer leeren Zeichenfolge finden, braucht also wirklich ein wenig mehr Arbeit –

Antwort

17

Sie müssen Vergleichsoperatoren gegen Funktionen auch wenn der Rückgabetyp bit ist verwenden.

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

Dank für den Vorschlag. Ich habe das versucht, aber Boolean ist kein anerkannter Datentyp. Ich verwende SQL Server 2008 R2 –

+1

Aktualisiert erneut .. bitte überprüfen. – Ravi

+1

Gutes Denken und nochmals vielen Dank. Die Verwendung von reservierten Wörtern in einer Abfrage kann einen Entwickler leicht ausfindig machen. In meinem Fall war das nicht das Problem. Ich habe den Vorschlag als nützlich :) –

4

Sie müssen die where-Klausel der Abfrage modifizieren, wie:

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

Dank Nikhil upvoted - nur von Thomas auf die Antwort geschlagen, also habe ich Ihnen eine upvote gegeben –

Verwandte Themen