Sql server 在SQL Server中的when语句中使用非布尔类型时出错
我正在尝试在SQLServer中编写一个函数,用于检查我的一个表中是否存在元组。如果是,则返回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_
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)是什么意思?它甚至不是有效的格式。@它们是参数。