Sql server 在SQL Server中的when语句中使用非布尔类型时出错

Sql server 在SQL Server中的when语句中使用非布尔类型时出错,sql-server,function,Sql Server,Function,我正在尝试在SQLServer中编写一个函数,用于检查我的一个表中是否存在元组。如果是,则返回1,否则应返回0 这是我写的: create function allow_user_to_score (@user_id char(6), @app_id char(7)) returns smallint as begin declare @result select @result = case when (@user_

我正在尝试在SQLServer中编写一个函数,用于检查我的一个表中是否存在元组。如果是,则返回
1
,否则应返回
0

这是我写的:

create function allow_user_to_score
    (@user_id char(6), @app_id char(7))
returns smallint
as 
begin
    declare @result

    select @result = case 
                        when (@user_id, @app_id) in (select * from installed_app) 
                           then 1 
                           else 0
    from installed_app

    return (@result)
end
但我得到了这个错误,我不知道为什么:

在需要条件的上下文中指定的非布尔类型的表达式

试试这个:

   declare @result smallint
    select @result = sign(count(*)) from installed_app 
                     where userId=@userId and appId=@appId
    return (@result)
如果您知道只能有1条记录(或0条),则可以删除sign()函数

   declare @result smallint
    select @result = sign(count(*)) from installed_app 
                     where userId=@userId and appId=@appId
    return (@result)

如果您知道只能有1条记录(或0条),则可以删除sign()函数,因为代码中有多个错误。我假设在已安装的应用程序表中有两列,分别为user\u id和app\u id

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS SMALLINT
AS 
BEGIN
    DECLARE @result smallint;

    SELECT @result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;
    RETURN @result;
END
正如Sean所提到的,可以很容易地将其转换为内联表值函数,从而大大提高性能

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS TABLE
AS RETURN
    SELECT result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;

您的代码中有多个错误。我假设在已安装的应用程序表中有两列,分别为user\u id和app\u id

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS SMALLINT
AS 
BEGIN
    DECLARE @result smallint;

    SELECT @result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;
    RETURN @result;
END
正如Sean所提到的,可以很容易地将其转换为内联表值函数,从而大大提高性能

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS TABLE
AS RETURN
    SELECT result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;

使用COUNT(*)来验证行的存在性是一个可怕的想法。随着表的增长,这将产生问题。这取决于表上的索引和表的大小,但我同意count(1)会更好。不,count(*)和count(1)或任何使用count()的变体在表增长时都会出现问题。EXISTS()是一种更好的方法来判断表是否有行。使用COUNT(*)来验证行的存在性是一个可怕的想法。随着表的增长,这将产生问题。这取决于表上的索引和表的大小,但我同意count(1)会更好。不,count(*)和count(1)或任何使用count()的变体在表增长时都会出现问题。EXISTS()是了解表是否有行的更好方法。将此标量函数转换为内联表值函数可能是个好主意。它将更加灵活和性能。完全同意您的意见@SeanLange,一如既往。将这个标量函数转换为内联表值函数可能是一个好主意。这将更加灵活和高效。完全同意你的看法@SeanLange,像往常一样。
(…)
中的
(@user\u id,@app\u id)到底是什么意思?它甚至不是有效的格式。@Eric它们是参数。(…)
中的
(@user\u id,@app\u id)是什么意思?它甚至不是有效的格式。@它们是参数。