【问题标题】:create function must be the only statement in the batchcreate 函数必须是批处理中的唯一语句
【发布时间】:2014-07-28 19:31:45
【问题描述】:

我从函数中收到此错误:

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 结尾。

标签: sql-server


【解决方案1】:

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

例如

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

【讨论】:

  • 注意:此“GO”分隔符取决于客户端应用程序。例如,GO 是 SSMS 的默认值,但它可以更改为您想要的任何其他值。重要的是要记住这与服务器无关。它只是“告诉”客户端将这两个GO 之间的代码作为一批发送
【解决方案2】:

把它变成一个内联表值函数。这将比标量函数执行得更好。此外,您不应该对字符数据类型使用默认大小。你知道 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

【讨论】:

  • 成功了!我如何调用这个函数并发送变量? ALTER TABLE 潜水添加约束...
  • 我试过:'ALTER TABLE Diving ADD CONSTRAINT getLavel CHECK (dbo.getLavel(guide,"guide") != null);'但我收到此错误:找不到列“dbo”或用户定义的函数或聚合“dbo.getLavel”,或者名称不明确。
  • 您正在创建标量,以便可以将其用作列上的约束?你一开始没有提到这一点。您不能将表值函数用作约束破解。为此,您将不得不返回到标量函数。
  • 对不起,你能解释一下标量函数有什么不同吗?
  • 试试这个链接。它可以比我更清楚地解释它。 technet.microsoft.com/en-us/library/…
【解决方案3】:

需要在END语句前加上RETURN

这应该可以解决您的问题,这就是解决我的问题。 :D

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:
        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
        

        【讨论】:

        • 欢迎来到stackoverflow!如果您添加一些关于为什么这会回答问题的解释会有所帮助。
        【解决方案7】:

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

        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
        

        【讨论】:

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