【问题标题】:SQL Server : the last statement included within a function must be a return statementSQL Server:函数中包含的最后一条语句必须是返回语句
【发布时间】:2015-05-17 14:41:15
【问题描述】:

我正在编写以下函数来根据我传递给函数的参数检查表中的行并返回数据类型位结果。

函数如下:

create function dbo.udf_my_func(@var1 varchar(15), @var2 varchar(30))
returns bit as  
begin 
    if not exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 = 1)
    begin
        return 0
    end

    if exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 = @var2)
    begin
        return 1
    end

    if exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 <> @var2)
    begin
        return 0
    end

end
go

但是我收到了这个错误:

函数中包含的最后一条语句必须是返回语句

请告诉我如何解决这个问题。提前致谢!

【问题讨论】:

  • 如果所有的 if 都失败了,它应该返回什么?

标签: sql sql-server function


【解决方案1】:

我建议你使用标准类型的编写函数是:

CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> 
(
    -- Add the parameters for the function here
    <@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
    -- Declare the return variable here
    DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>

    -- Add the T-SQL statements to compute the return value here
    SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>

    -- Return the result of the function
    RETURN <@ResultVar, sysname, @Result>

END
GO

所以你的函数应该是这样的:
(注意我把你的检查顺序颠倒了)

CREATE FUNCTION dbo.udf_my_func(@var1 varchar(15), @var2 varchar(30))
RETURNS bit AS  
BEGIN 
    DECLARE @ResultVar bit = 0
    IF EXISTS(SELECT 1 FROM Sample_table(nolock) WHERE var1 = @var1 AND var2 <> @var2)
    BEGIN
        SELECT @ResultVar = 0
    END
    IF EXISTS(SELECT 1 FROM Sample_table(nolock) WHERE var1 = @var1 AND var2 = @var2)
    BEGIN
        SELECT @ResultVar = 1
    END
    IF NOT EXISTS(SELECT 1 FROM Sample_table(nolock) WHERE var1 = @var1 AND var2 = 1)
    BEGIN
        SELECT @ResultVar = 0
    END
    RETURN @ResultVar
END
GO

但是您可以使用许多更好的方法,例如:

CREATE FUNCTION dbo.udf_my_func(@var1 varchar(15), @var2 varchar(30))
RETURNS bit AS  
BEGIN 
    DECLARE @ResultVar bit = 0
    SELECT @ResultVar = CASE 
                            WHEN var1 = @var1 AND var2 <> @var2 THEN 0
                            WHEN var1 = @var1 AND var2 = @var2 THEN 1
                            WHEN var1 = @var1 AND var2 = 1 THEN 0
                            ELSE @ResultVar
                        END
    RETURN @ResultVar
END
GO

【讨论】:

    【解决方案2】:

    您没有为这种情况定义返回值:var1 @var 1

    create function dbo.udf_my_func(@var1 varchar(15), @var2 varchar(30))
    returns bit as  
    begin 
    
    
        if not exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 = 1)
        begin
            return 0
        end
    
    
            if exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 = @var2)
        begin
            return 1
        end
    
            if exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 <> @var2)
        begin
            return 0
        end
    
        -- else
        return 0 
    end
    go
    

    你可以优化你的代码:

    create function dbo.udf_my_func(@var1 varchar(15), @var2 varchar(30))
        returns bit as  
        begin 
    
    
            if exists (select 1 from Sample_table(nolock) where var1 = @var1 and var2 = @var2)
            begin
                return 1
            end
            -- place other conditions that return 1 here
    
            -- else
            return 0 
        end
        go
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多