2013-05-31 10 views
9

Spero che ciò non sembri troppo semplice. Ho esaminato questo aspetto, ma non sono così bravo con le funzioni definite dall'utente SQL e il loro uso, quindi non sono sicuro di cosa sta succedendo. Chi immagina un paio di punti per dirmi perché sto ottenendo l'errore:Esecuzione di una funzione definita dall'utente SQL che restituisce booleano, in cui clausola

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

Per questo:

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

in cui la funzione può essere creato utilizzando:

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

Questa funzione è per verificare se una stringa è un singolo carattere specificato, ripetuto. Spero che qualcuno lo trovi utile!

+0

cautela - la mia funzione sarà anche trovare campi con valori nulli o una stringa vuota, in modo davvero bisogno di un po 'di lavoro –

risposta

17

è necessario utilizzare gli operatori di confronto contro funzioni anche se il tipo di ritorno è 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

Grazie per il suggerimento. Ho provato questo, ma booleano non è un tipo di dati riconosciuto. Sto usando SQL Server 2008 R2 –

+1

Aggiornato di nuovo .. si prega di controllare. – Ravi

+1

Buon pensiero e grazie ancora. L'uso di parole riservate in una query può facilmente catturare uno sviluppatore. Nel mio caso, questo non era il problema. Ho consigliato il suggerimento come consigliato :) –

4

è necessario modificare la clausola where della query come:

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

Grazie Nikhil - appena battuto alla risposta di Thomas, quindi ti ho dato un upvote –

Problemi correlati