create function必须是批处理中唯一的语句

时间:2014-07-28 19:31:46

标签: sql-server

我从函数中得到了这个错误:

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel =level_name)
    return @date
END
GO

可能是什么原因?

非常感谢。

7 个答案:

答案 0 :(得分:10)

该函数需要是查询窗口中的唯一函数或批处理中的唯一语句。如果查询窗口中有更多语句,则可以使其成为批处理中的唯一语句"用GO来包围它。

e.g。

GO
CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE     diver_number = @id and @lavel =level_name)
    return @date
END
GO

答案 1 :(得分:3)

将其转换为内联表值函数。这将比标量函数表现更好。此外,您不应使用字符数据类型的默认大小。你知道char的默认长度是多少吗?您是否知道它可能会根据使用情况而有所不同?

CREATE FUNCTION getLavel
(
    @id int
    , @lavel char --You need to define the length instead of the default length
) 
RETURNS table
return 
    select authorization_date 
    from Authorized 
    WHERE diver_number = @id 
        and @lavel = level_name

GO

答案 2 :(得分:3)

您需要在END语句

之前添加RETURN

那应该解决你的问题,那就是我的问题。 :d

答案 3 :(得分:1)

在执行之前,请确保此语句是查询窗口中唯一的唯一sql。

或者您可以突出显示函数声明并执行

答案 4 :(得分:0)

CREATE FUNCTION CalculateAge(@DOB  DATE) 
RETURNS INT 
AS
BEGIN
DECLARE @Age INT
SET @DOB='08/12/1990'
SET @Age =DATEDIFF(YEAR,@DOB,GETDATE()) -
   CASE
        WHEN (MONTH (@DOB)>  MONTH (GETDATE ())) OR
             (MONTH (@DOB)= MONTH (GETDATE ())  AND DAY (@DOB) >DAY (GETDATE ()))

    THEN 1 
    ELSE 0
    END 
SELECT @Age
END

答案 5 :(得分:0)

为我解决了什么,是因为我试图在事务上下文中创建函数 - 从SQL Server的角度来看这是没有意义的。交易是针对数据而非函数。

将CREATE FUNCTION语句从事务中取出,然后将其包装在GO

答案 6 :(得分:0)

仅在查询页面中会给出错误,但是如果执行查询,它将成功执行。

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel = level_name)
    return @date
END
GO