Sql server 调用时表现为布尔表达式的T-SQL函数?

Sql server 调用时表现为布尔表达式的T-SQL函数?,sql-server,tsql,function,boolean,bit,Sql Server,Tsql,Function,Boolean,Bit,我正在尝试编写一个计算结果为布尔值的T-SQL函数 我读过几篇文章指出BIT是布尔类型的T-SQL等价物(例如,) 然而,当我创建函数返回位时: create function dbo.fn_checkLength( @name nvarchar(50), @maxLength int) returns bit as begin if len(@name) > @maxLength return cast(0 as bit); return cast(1 as bit)

我正在尝试编写一个计算结果为布尔值的T-SQL函数

我读过几篇文章指出BIT是布尔类型的T-SQL等价物(例如,)

然而,当我创建函数返回位时:

create function dbo.fn_checkLength( @name nvarchar(50), @maxLength int) returns bit
as begin

    if len(@name) > @maxLength return cast(0 as bit);

    return cast(1 as bit);
end;
GO
它的行为与计算结果为布尔值的函数不同,因为以下语句:

create table dbo.test_table (
    id int,
    name nvarchar(50),

    constraint
        ck_test_table_maxLength
    check (
        dbo.fn_checkLength(name, 10)
    )
);
GO
给我:

Msg 4145,第15级,状态1,第10行
在预期条件的上下文中指定的非布尔类型的表达式,靠近''

为了使其工作,在调用我的函数时,我在混合中添加了一个布尔运算符,以使表达式真正成为布尔表达式:

create table dbo.test_table (
    id int,
    name nvarchar(50),

    constraint
        ck_test_table_maxLength
    check (
        dbo.fn_checkLength(name, 10) > 0
    )
);
GO
为什么会这样?是否有任何方法可以将T-SQL语句中使用的函数声明为正则布尔表达式

谢谢

之前,SQL没有真正的布尔数据类型,目前很少有实现支持此功能

位类型不是真正的布尔类型-它是数值类型,可以有值1或0(或NULL)

因此,除非您使用支持此功能的SQL:1999实现,否则您将不得不在check子句中使用布尔表达式。

之前SQL没有真正的布尔数据类型,目前很少有实现支持此功能

位类型不是真正的布尔类型-它是数值类型,可以有值1或0(或NULL)


因此,除非您使用支持此功能的SQL:1999实现,否则您将不得不在check子句中使用布尔表达式。

很有趣。。我想唯一的解释是,CHECK根据定义只接受“计算结果为TRUE或FALSE的条件表达式”。根据
中的第二行,您可以使用基于逻辑运算符返回TRUE或FALSE的任何逻辑(布尔)表达式创建检查约束。
“逻辑运算符”是关键。

有趣。。我想唯一的解释是,CHECK根据定义只接受“计算结果为TRUE或FALSE的条件表达式”。根据
中的第二行,您可以使用基于逻辑运算符返回TRUE或FALSE的任何逻辑(布尔)表达式创建检查约束。
“逻辑运算符”是关键。

如果dbo.somefunc()=1,键入
实际上并不比键入
如果dbo.somefunc()
难多少,是吗?另外,如果您想像此函数一样返回布尔值,则应说
=1
而不是
>0
。检查=0和=我就是这样做的。并不是说其他方式是“错误的”,但我就是这么做的。我认为Access(Jet)过去是“-1”和“0”,因此我选择了这个=0或=0习惯。@Aaron,不,键入“=1”并不难,但在使用函数时更容易出错,仅此而已。事实上,您需要添加布尔运算符才能使其工作,这意味着您可以以多种不同的方式编写相同的检查(=1,!=0,0,>0…),因此使用此函数的不同编码器将使用不同的编码样式来调用它;代码将很难阅读,并且在将来的某个时候会导致bug,一旦一个编码者因为他们不同的编码风格而误解了另一个编码者的意图。我更喜欢一个真正的bool函数而不是hack函数,但是看起来我运气不好。如果dbo.somefunc()=1,键入
并不比键入
如果dbo.somefunc()
难多少,是吗?另外,如果您想像此函数一样返回布尔值,则应说
=1
而不是
>0
。检查=0和=我就是这样做的。并不是说其他方式是“错误的”,但我就是这么做的。我认为Access(Jet)过去是“-1”和“0”,因此我选择了这个=0或=0习惯。@Aaron,不,键入“=1”并不难,但在使用函数时更容易出错,仅此而已。事实上,您需要添加布尔运算符才能使其工作,这意味着您可以以多种不同的方式编写相同的检查(=1,!=0,0,>0…),因此使用此函数的不同编码器将使用不同的编码样式来调用它;代码将很难阅读,并且在将来的某个时候会导致bug,一旦一个编码者因为他们不同的编码风格而误解了另一个编码者的意图。我更喜欢真正的bool函数而不是hack函数,但是看起来我运气不好。