Sql server create函数必须是批处理中的唯一语句

Sql server create函数必须是批处理中的唯一语句,sql-server,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 原因可能是什么 非常感谢。在执行

我从函数中得到此错误:

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
原因可能是什么


非常感谢。

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


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

将其转换为内联表值函数。这将比标量函数执行得更好。此外,不应使用字符数据类型的默认大小。你知道字符的默认长度是多少吗?你知道吗,它可以根据使用情况而变化

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

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

e、 g


您需要在END语句之前添加RETURN


这应该能解决你的问题,这就是我的问题D

解决这个问题的方法是,我试图在事务上下文中创建函数——从SQL Server的角度来看,这是没有意义的。事务用于数据,而不是函数

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

将CREATE FUNCTION语句从事务中取出,然后将其包装在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

你犯了什么错误?因为你把所有的东西都塞进了一条线。为什么要使用子查询来填充变量?这整件事看起来很适合使用intvf而不是标量函数。脚本中是否包含了您的语句和其他语句?如果是这样的话,函数前面的语句需要在末尾加一个
GO
。这样就行了!如何调用此函数并发送变量?ALTER TABLE Diving ADD CONSTRAINT…我试过:'ALTER TABLE Diving ADD CONSTRAINT getLavel CHECK(dbo.getLavel(guide,“guide”)!=null);'但是我得到了这个错误:找不到列“dbo”或用户定义函数或聚合“dbo.getLavel”,或者名称不明确。您正在创建标量,以便将其用作列上的约束?你一开始没有提到这一点。不能将表值函数用作约束破解。你必须回到标量函数。对不起,你能解释一下标量函数有什么不同吗?试试这个链接。它比我解释得更清楚。欢迎来到stackoverflow!如果你能解释一下为什么这个问题会得到答案,这会有所帮助。
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