sal*_*lim 14 sql sql-server-2005
我有这个功能,我想创建.当我解析它时,它工作正常,但实际上在数据库中创建函数它说我的列名无效.事实并非如此,我拼写正确.这是代码:
ALTER FUNCTION [dbo].[fnTally] (@SchoolId nvarchar(50))
RETURNS int
AS
BEGIN
DECLARE @Final nvarchar
IF EXISTS (
SELECT
question,
yes_ans,
no_ans,
na_ans,
blank_ans
FROM dbo.qrc_maintally
WHERE school_id = @SchoolId
)
IF yes_ans > no_ans AND yes_ans > na_ans
BEGIN
SET @Final = 'Yes'
END
ELSE IF no_ans > yes_ans AND no_ans > na_ans
BEGIN
SET @Final = 'No'
END
ELSE IF na_ans > yes_ans AND na_ans > no_ans
BEGIN
SET @Final = 'N/A'
END
RETURN @Final
END
Run Code Online (Sandbox Code Playgroud)
ALTER FUNCTION [dbo].[fnTally] (@SchoolId nvarchar(50))
RETURNS nvarchar(3)
AS BEGIN
DECLARE @Final nvarchar(3)
SELECT @Final = CASE
WHEN yes_ans > no_ans AND yes_ans > na_ans THEN 'Yes'
WHEN no_ans > yes_ans AND no_ans > na_ans THEN 'No'
WHEN na_ans > yes_ans AND na_ans > no_ans THEN 'N/A' END
FROM dbo.qrc_maintally
WHERE school_id = @SchoolId
Return @Final
End
Run Code Online (Sandbox Code Playgroud)
如您所见,这大大简化了代码.它还会使代码中的其他错误更加明显:您正在返回一个nvarchar,但声明该函数返回一个int(在上面的代码中已更正).
您需要为这些列创建局部变量,在选择期间分配它们并将它们用于条件测试.
declare @yes_ans int,
@no_ans int,
@na_ans int
SELECT @yes_ans = yes_ans, @no_ans = no_ans, @na_ans = na_ans
from dbo.qrc_maintally
where school_id = @SchoolId
If @yes_ans > @no_ans and @yes_ans > @na_ans
begin
Set @Final = 'Yes'
end
-- etc.
Run Code Online (Sandbox Code Playgroud)
If yes_ans > no_ans and yes_ans > na_ans
Run Code Online (Sandbox Code Playgroud)
您在语句中(在查询之外)使用列名。如果需要变量,则必须声明并分配它们。