T-SQL函数,当被调用时,表现为布尔表达式?

时间:2013-03-29 16:25:50

标签: sql-server tsql function boolean bit

我正在尝试编写一个评估为布尔值的T-SQL函数。

我已经阅读了几篇文章,声明BIT是T-SQL等同于BOOLEAN类型(例如Is there a Boolean data type in Microsoft SQL Server like there is in MySQL?http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c3143a77-c921-40a7-920e-3d5c5f7a269a)。

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

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,Level 15,State 1,Line 10
  在预期条件的上下文中指定的非布尔类型的表达式,在')'附近。

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

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语句中用作常规布尔表达式的函数?

谢谢!

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

有趣..我猜唯一的解释是,CHECK按定义只接受'计算结果为TRUE或FALSE'的条件表达式。根据{{​​3}} You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators.中的第二行,“逻辑运算符”是关键。