如果在Sql Server函数中也是如此

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)

Joe*_*orn 9

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(在上面的代码中已更正).


Joe*_*lli 7

您需要为这些列创建局部变量,在选择期间分配它们并将它们用于条件测试.

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)


Amy*_*y B 2

If yes_ans > no_ans and yes_ans > na_ans  
Run Code Online (Sandbox Code Playgroud)

您在语句中(在查询之外)使用列名。如果需要变量,则必须声明并分配它们。