【问题标题】:SQL User Defined Function Generates a Non-Boolean Type ErrorSQL 用户定义函数生成非布尔类型错误
【发布时间】:2013-05-26 21:10:06
【问题描述】:

我在 SQL 用户定义函数上收到此错误:

在上下文中指定的非布尔类型的表达式 条件是预期的,在 ')' 附近。

为此:

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

此函数用于检查字符串是否为任何指定的单个字符,重复。

【问题讨论】:

  • 警告 - 我的函数也会找到具有空值或空字符串的字段,所以真的需要更多的工作

标签: sql function boolean where-clause


【解决方案1】:

您需要将查询的 where 子句修改为:

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

【讨论】:

  • 感谢 Nikhil - 刚刚被 Thomas 击败,所以我给了你一个支持
【解决方案2】:

即使返回类型是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
    

    【讨论】:

    • 感谢您的建议。我试过这个,但布尔不是公认的数据类型。我正在使用 SQL Server 2008 R2
    • 再次更新..请检查。
    • 好主意,再次感谢。在查询中使用保留字很容易让开发人员措手不及。就我而言,这不是问题。我认为这个建议很有用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多