SQL 用户定义函数生成非布尔类型错误
Posted
技术标签:
【中文标题】SQL 用户定义函数生成非布尔类型错误【英文标题】:SQL User Defined Function Generates a Non-Boolean Type Error 【发布时间】: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
此函数用于检查字符串是否为任何指定的单个字符,重复。
【问题讨论】:
警告 - 我的函数也会找到具有空值或空字符串的字段,所以真的需要更多的工作 【参考方案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 再次更新..请检查。 好主意,再次感谢。在查询中使用保留字很容易让开发人员措手不及。就我而言,这不是问题。我认为这个建议很有用:)以上是关于SQL 用户定义函数生成非布尔类型错误的主要内容,如果未能解决你的问题,请参考以下文章
在预期条件的上下文中指定的非布尔类型的表达式,靠近 IDT 中的“)”错误
SQLServer 空间查询返回错误在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'