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

19 浏览
0 Comments

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

我正在尝试编写一个评估为布尔值的T-SQL函数。\n我读过几篇文章,它们声称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)。\n然而,当我创建返回BIT的函数时:\n

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

\n它并不像一个评估为布尔值的函数那样工作,因为下面的语句:\n

create table dbo.test_table (
    id int,
    name nvarchar(50),
    constraint
        ck_test_table_maxLength
    check (
        dbo.fn_checkLength(name, 10)
    )
);
GO

\n给出了以下错误:\n

\nMsg 4145, Level 15, State 1, Line 10
\n 在需要条件的上下文中指定了非布尔类型的表达式,附近是\')\'。\n

\n为了使其工作,在调用我的函数时,我必须添加一个布尔运算符,以确保表达式真正是布尔类型的:\n

create table dbo.test_table (
    id int,
    name nvarchar(50),
    constraint
        ck_test_table_maxLength
    check (
        dbo.fn_checkLength(name, 10) > 0
    )
);
GO

\n为什么会这样?有没有办法声明一个可以在T-SQL语句中像常规布尔表达式一样使用的函数?\n谢谢!

0
0 Comments

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

那么为什么需要一个在调用时表现为布尔表达式的T-SQL函数呢?可能是因为某些情况下,我们需要在查询中使用复杂的逻辑判断,并将其封装为一个函数以便重复使用。

解决这个问题的方法有很多种。一种方法是使用CASE语句来模拟布尔表达式。我们可以在函数中编写一个CASE语句,根据条件返回TRUE或FALSE。例如:

CREATE FUNCTION IsTrue (@value INT)
RETURNS BIT
AS
BEGIN
    DECLARE @result BIT
    SET @result = CASE WHEN @value > 0 THEN 1 ELSE 0 END
    RETURN @result
END

另一种方法是使用IF语句。我们可以在函数中编写一个IF语句,根据条件设置一个变量的值,并返回该变量。例如:

CREATE FUNCTION IsTrue (@value INT)
RETURNS BIT
AS
BEGIN
    DECLARE @result BIT
    IF @value > 0
        SET @result = 1
    ELSE
        SET @result = 0
    RETURN @result
END

无论使用哪种方法,我们都可以将这个函数作为布尔表达式在查询中使用。例如:

SELECT * FROM SomeTable WHERE dbo.IsTrue(Column1) = 1

这样,我们就可以在T-SQL中使用一个函数来模拟布尔表达式的行为了。

0
0 Comments

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

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

因此,除非你使用支持这个功能的SQL:1999实现,否则你只能在检查子句中使用布尔表达式。

要解决这个问题,我们可以使用T-SQL函数来模拟布尔表达式的行为。当调用这个函数时,它会返回一个布尔值,可以在检查子句中使用。

下面是一个例子,展示了如何创建一个T-SQL函数来模拟布尔表达式的行为:

CREATE FUNCTION dbo.IsAdult(@age INT)
RETURNS BIT
AS
BEGIN
    IF @age >= 18
        RETURN 1;
    ELSE
        RETURN 0;
END;

在上面的例子中,我们创建了一个名为IsAdult的函数,它接受一个整数参数age,并返回一个位类型的值。如果age大于等于18,函数返回1;否则返回0。

现在我们可以在检查子句中使用这个函数,就像使用布尔表达式一样:

SELECT *
FROM Users
WHERE dbo.IsAdult(age) = 1;

上面的查询将返回所有年龄大于等于18的用户。

通过使用T-SQL函数来模拟布尔表达式的行为,我们可以在不支持真正布尔类型的SQL实现中使用布尔逻辑。这为我们提供了更灵活和强大的条件判断能力。

0