2013-05-31 19 views
9

numaralı makalede bu çok basit görünmüyor. Ben bu baktım ama SQL kullanıcı tanımlı fonksiyonlar ve onların kullanımı çok iyi değilim, bu yüzden neler olup bittiğinden emin değilim. Bunun içinSQL kullanıcı tanımlı işlevi, boole döndüren işlevi çalıştırarak,

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

:

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

fonksiyonu kullanılarak oluşturulabilir:

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

Bu fonksiyon Kim neden hata alıyorum söylediğin için birkaç noktayı sanan Bir dizgenin herhangi bir tek karakterli olup olmadığını kontrol etmek içindir, tekrarlanır. Umarım birisi yararlı bulur!

+0

dikkat - aynı zamanda boş değerler veya boş dize ile alanları bulacaksınız benim işlevi, bu yüzden gerçekten biraz daha fazla iş –

cevap

17

Sen dönüş tipi bit olsa bile fonksiyonlar karşı karşılaştırma operatörlerini kullanmalıdır deneyin.

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

Bu

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

Teşekkür ihtiyacı öneri için. Bunu denedim, ancak boolean tanınan bir veri türü değil. Ben SQL Server 2008 R2 –

+1

kullanıyorum Güncelleme tekrar .. Lütfen kontrol edin. – Ravi

+1

İyi düşünce ve tekrar teşekkürler. Bir sorguda ayrılmış kelimelerin kullanımı kolayca bir geliştiriciyi yakalayabilir. Benim durumumda sorun bu değildi. Öneriyi yararlı olarak kullandım :) –

4

Sen olarak Sorgunuzun nerede maddesini değiştirmek gerekir:

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

Teşekkürler Nikhil - sadece Thomas'ın cevabına yenildim, bu yüzden size bir vekalet verdim –