消息 178,级别 15,状态 1,第 8 行 在此上下文中不能使用具有 return 值的 RETURN 语句

Msg 178, Level 15, State 1, Line 8 A RETURN statement with a return value cannot be used in this context

我在尝试执行以下 SQL 时收到此错误消息。

错误:

Msg 156, Level 15, State 1, Line 5 Incorrect syntax near the keyword 'FUNCTION'. Msg 178, Level 15, State 1, Line 8 A RETURN statement with a return value cannot be used in this context.

SQL:

IF (NOT EXISTS (SELECT * FROM DBO.TRACKING WHERE CR = 123)) 

BEGIN

  CREATE FUNCTION [dbo].[UDFDate]()
  RETURNS DATETIME
  AS BEGIN
     RETURN CAST('9999-12-31' AS DATETIME)
  END
END

是否不允许在 if 语句中创建函数?

您不能在 if 语句中创建函数,这样您将收到以下警告

Incorrect syntax: CREATE FUNCTION must be the only statment in the batch

您可以通过在该变量中创建一个变量来存储创建查询并执行它:

IF (NOT EXISTS (SELECT * FROM DBO.TRACKING WHERE CR = 123)) 

BEGIN

 DECLARE @strQuery AS VARCHAR(MAX)

 SET @strQuery = '

  CREATE FUNCTION [dbo].[UDFDate]()
  RETURNS DATETIME
  AS BEGIN
     RETURN CAST(''9999-12-31'' AS DATETIME)
  END
'

EXEC(@strQuery)

END

但我不明白为什么要为 return 静态值创建一个函数??!!

您没有理由想要在运行时在存储过程中创建函数。 SQL SERVER 中的函数与存储过程类似,所以如果你想创建一个函数,你需要在存储过程的上下文和范围之外进行,并且它将保存在你的数据库中以供随时访问时间.

Ontopic,如果您只想展示该日期值,您可以删除函数创建和 select 日期时间结果,如下所示:

IF (NOT EXISTS (SELECT TOP 1 1 FROM DBO.TRACKING WHERE CR = 123)) 
BEGIN    
  SELECT CAST('9999-12-31' AS DATETIME)
END

PS:当您只想知道某个值是否存在时,不要使用 "SELECT *"。当您只想知道是否存在任何内容时,它会产生不必要的开销来获取所有列。