2013-05-31 33 views
9

希望这看起来不太简单。我已经看了这个,但我不擅长SQL用户定义的函数和它们的使用,所以我不知道发生了什么。谁幻想告诉我为什么我收到错误几点:运行SQL用户定义的函数返回布尔值,在where子句中

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

其中函数可以使用创建:

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

此功能用于检查一个字符串是否是任何指定的单个字符,重复。希望有人认为它有用!

+0

谨慎 - 我的功能也将找到空值或空字符串字段,所以真的需要一些更多的工作 –

回答

17

您必须使用比较运算符对即使返回类型为bit功能。

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

尝试这个

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

谢谢对于这个建议。我试过这个,但布尔值不是一个可识别的数据类型。我正在使用SQL Server 2008 R2 –

+1

再次更新..请检查。 – Ravi

+1

好的想法和再次感谢。在查询中使用保留字可以很容易地将开发人员赶出去。在我的情况下,这不是问题。我已经把upvoted的建议视为有用:) –

4

您需要修改您的查询的WHERE子句:

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

谢谢Nikhil - 只是被Thomas殴打的答案,所以我给你一个upvote –

相关问题