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

Posted

技术标签:

【中文标题】T-SQL 函数在调用时表现为布尔表达式?【英文标题】:T-SQL function that, when called, behaves as a boolean expression? 【发布时间】:2013-03-20 09:21:31 【问题描述】:

我正在尝试编写一个计算结果为布尔值的 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

给我:

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

谢谢!

【问题讨论】:

输入IF dbo.somefunc() = 1 并不比输入IF dbo.somefunc() 难,是吗?此外,如果你想让这个函数返回一个布尔值,你应该说= 1 而不是> 0 检查 =0 和 !=0 是我的做法。并不是说其他​​方式是“错误的”,但这就是我所做的。我认为 Access(Jet) 曾经是“-1”和“0”,因此我养成了这个 =0 或 !=0 的习惯。 @Aaron,不,输入“=1”并不难,但在使用函数时更可能出错,仅此而已。您需要添加布尔运算符以使其工作这一事实意味着您可以以多种不同的方式编写相同的检查(=1、!=0、0、>0...),因此不同的编码器使用此函数将使用不同的编码风格来调用它;代码将难以阅读,并且在未来某个时候会导致错误,一旦一个编码员由于他们不同的编码风格而误解了其他编码员的意图。我更喜欢真正的布尔函数而不是黑客,但看起来我不走运。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于T-SQL 函数在调用时表现为布尔表达式?的主要内容,如果未能解决你的问题,请参考以下文章

楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

第八周

JavaScript——驰骋网页的脚本执行者

布尔测试函数重写

正则表达式 '\b' 的 T-SQL 等效项

JAVA 流程控制之选择语句