在where子句中运行返回boolean的SQL用户定义函数

Chr*_*row 18 sql boolean function where-clause sql-server-2008-r2

希望这似乎不太简单.我已经看了这个,但我不太擅长SQL用户定义的函数及其使用,所以我不确定发生了什么.为了告诉我为什么我收到错误,他们想了几点:

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

为了这:

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0')
Run Code Online (Sandbox Code Playgroud)

可以使用以下方法创建函数:

-- ***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
Run Code Online (Sandbox Code Playgroud)

此函数用于检查字符串是否是任何指定的单个字符,重复.希望有人发现它有用!

Tho*_*mas 23

即使返回类型是,也必须对函数使用比较运算符bit.

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1
Run Code Online (Sandbox Code Playgroud)


Rav*_*avi 8

尝试这个

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
Run Code Online (Sandbox Code Playgroud)

  • 很好的想法,再次感谢。在查询中使用保留字可以很容易地让开发人员脱颖而出。就我而言,这不是问题。我赞成这个建议有用:) (2认同)

nik*_*nto 5

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

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1
Run Code Online (Sandbox Code Playgroud)