1

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

我已经阅读了几篇文章,指出 BIT 是 T-SQL 等效于 BOOLEAN 类型(例如Microsoft SQL Server 中是否有像 MySQL 中那样的布尔数据类型?http://social.msdn.microsoft.com/论坛/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

给我:

消息 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 语句中使用的函数声明为常规布尔表达式?

谢谢!

4

2 回答 2

7

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

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

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

于 2013-03-29T16:40:04.787 回答
1

Interesting.. I guess the only explanation is, CHECK by definition accepts only 'conditional expression that evaluates to TRUE or FALSE'. As per the second line in the documentation You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators. 'Logical operators' is the key.

于 2013-03-29T16:40:59.383 回答